使用c#乙個最常見的問題便是各種型別間的轉換。
c#中型別轉換的有兩種,()轉換和convert轉換。
我想知道的是這兩個轉換的區別
還有就是()轉換我用了發現好多不能轉換過來,但是convert是萬能轉換的,那什麼時候該用()什麼時候該用convert呢?
最後問下子,把int sum 怎麼用()轉換成float型別?
請詳細說明,最好有舉例。
(1)這兩個方法的最大不同是它們對null值的處理方法:
convert.toint32(null)會返回0而不會產生任何異常,但int.parse(null)則會產生異常。
沒搞清楚convert.toint32和int.parse()的細細微區別時千萬別亂用,否則可能會產生無法預料的結果,舉例來說:假如從url中取乙個引數page的值,我們知道這個值是乙個int,所以即可以用 convert.toint32(request.querystring["page"]),也可以用,int.parse(request.querystring["page"]),但是如果page這個引數在url中不存在,那麼前者將返回0,0 可能是乙個有效的值,所以你不知道url中原來根本就沒有這個引數而繼續進行下一下的處理,這就可能產生意想不到的效果,而用後一種辦法的話沒有page 這個引數會丟擲異常,我們可以捕獲異常然後再做相應的處理,比如提示使用者缺少引數,而不是把引數值當做0來處理。
(2)還有一點區別就是
a. convert.toint32(double value)
如果 value 為兩個整數中間的數字,則返回二者中的偶數;即 3.5轉換為4,4.5 轉換為 4,而 5.5 轉換為 6。 不過4.6可以轉換為5,4.4轉換為4
b. int.parse("4.5")
直接報錯:"輸入字串的格式不正確".
c. int(4.6) = 4
int轉化其他數值型別為int時沒有四捨五入,強制轉換
int.parse是轉換string為int
convert.toint32是轉換繼承自object的物件為int的.
你得到乙個object物件,你想把它轉換為int,用int.parse就不可以,要用convert.toint32.
個人總結:
(1)convert.toint32的引數比較多,int.parse只能轉換string型別的.
(2)parse就是把string轉換成int,char,double....等,也就是*.parse(string) 括號中的一定要是string.
(3)convert可以提供多種型別的轉換,也就是convert.*()括號中可以為很多種型別(包括string).
解答:首先,在msdn(給出的解釋非常簡單,過於簡單。
更詳細的解釋如下:
在程式中,進行型別轉換是常見的事。那麼在c#中支援以前語言的型別轉換方法,即用型別名進行強行轉換,例如:
objectbjtest =newnewtype();
newtype newvalue = (newtype)objtest;
但是這樣轉換,有個嚴重的問題,就是在把objtest強轉換成newtype型別物件的時候,這個過程是不安全的,因此需要用try-catch語句來進行保護。這樣一來,比較安全的**方式應該如下所示。
objectbjtest =newnewtype();
newtype newvalue =null;
try
catch( exception err )
但是如上的寫法在c#中已經屬於過時的寫法,而且也屬於比較低效的寫法。在c#中比較高效而且安全的寫法,應該用as操作符,那麼完成如上類似功能的正確**應該如下。
objectbjtest =newnewtype();
newtype newvalue = objtestasnewtype;
那麼很明顯,如上的寫法首先看起來很簡便,至少**數量和強轉方式一樣。至於安全性,對於
as操作符來說,它不會做過的轉換操作,當需要轉換物件的型別屬於轉換目標型別或者轉換目標型別的派生型別的時候,那麼此轉換操作才能成功,而且並不產生新的物件。因此用as來進行型別轉換使安全的。為什麼用as操作符進行型別轉換的效率要高於老式的型別轉換的,因為用as操作符進行轉換就如前面所說的,首先判斷當前物件的型別,當型別滿足要求後才進行轉換。而傳統的型別轉換方式,是用當前物件直接去轉換,而且為了保護轉換成功,要加上try-catch,這就決定了它的效率不會高於as操作符的效率。
要注意的時候,不管用傳統方式,還是用as操作符進行型別轉換之後,在使用之前,需要進行判斷轉換是否成功,如下:
if( newvalue!=null)
但是,使用as操作符有如下幾點限制。
第乙個就是,不用在型別之間進行型別轉化,即如下編寫就會出現編譯錯誤。
newtype newvalue =newnewtype();
newtype1 newvalue = newvalueasnewtype1;
第二個就是,不能應用在值型別資料,即不能如下寫(也會出現編譯錯誤)。
objectbjtest = 11;
intnvalue = objtestas
int;
對於第一點所提的,可以用傳統的型別轉換方式來完成,但是光用如下的方式,是不能正確完成。
newtypeone newtestone =newnewtypeone();
newtypetwo newtesttwo = (newtypetwo)newtestone;
但是光如上寫是不能完成的,要想使如上的操作能正確完成,在原有型別中增加型別轉換操作符函式,即需要完成類似如下的**。
public
classnewtypeone
} 對於第二點所提的,在c#中可以使用is操作符,再加上老式的型別轉換操作,就可以安全完成轉換,那麼要完成如上操作,正確的寫法如下。
objectbjtest = 11;
if( objtestis
int)
除了如上兩點限制外,在用as操作符來進行型別轉換的時候,有個細微的問題。在前面所說的,用as來進行型別轉換的時候,所要轉換的物件型別必須是目標型別或者轉換目標型別的派生型別,那麼這樣就有個問題,即用as操作符來進行型別轉換的時候無法轉換成正確的型別,也就是說本來應該轉換成子型別,卻轉換成了父型別。但是我並不認為這是個嚴重問題,因為在用as操作符來進行型別轉換的時候,如何選擇目標型別在編碼的時候已經很明確了,即用父型別作為目標型別,那麼型別轉換的目的就是轉換成父型別物件進行操作;反之亦然。
在c#中已經提供了乙個很好的型別轉換方式,那麼在進行型別轉換的時候,可以按照如下的方式進行選擇。
型別轉換
使用選擇
object =>
已知引用型別
使用as操作符來完成
object =>
已知值型別
先使用is操作符來進行判斷,再用型別強轉方式進行轉換
已知引用型別之間轉換
首先需要相應型別提供轉換函式,再用型別強轉方式進行轉換
已知值型別之間轉換
最好使用系統提供的convert類所涉及的靜態方法
C 中的型別轉換總結
1 型別轉換 1 在下面這些表示式中,編譯器會自動轉換運算物件的型別 1 在大多數表示式中,比int型別小的整型值首先提公升為較大的整數型別。2 在條件中,非布林值轉換成布林型別。3 初始化過程中,初始值轉換成變數的型別 在賦值語句中,右側運算物件轉換成左側運算物件的型別。4 如果算術運算或關係運算...
C 型別轉換總結
c風格的強制型別轉換 type cast 很簡單,不管什麼型別的轉換統統是 type b type a。c 風格的型別轉換提供了4種型別轉換操作符來應對不同場合的應用。const cast,字面上理解就是去const屬性。static cast,命名上理解是靜態型別轉換。如int轉換成char。dy...
C 型別轉換總結
c風格的強制型別轉換 type cast 很簡單,不管什麼型別的轉換統統是 type b type a。c 風格的型別轉換提供了4種型別轉換操作符來應對不同場合的應用。看似問題複雜化了,其實不然。c風格的型別轉換在程式語句中難以識 c風格的強制型別轉換 type cast 很簡單,不管什麼型別的轉換...