在程式中,進行型別轉換是常見的事。那麼在c#中支援以前語言的型別轉換方法,即用型別名進行強行轉換,例如:
object objtest = new newtype();
newtype newvalue = (newtype)objtest;
但是這樣轉換,有個嚴重的問題,就是在把objtest強轉換成newtype型別物件的時候,這個過程是不安全的,因此需要用try-catch語句來進行保護。這樣一來,比較安全的**方式應該如下所示。
object objtest = new newtype();
newtype newvalue = null;
trynewvalue = (newtype)objtest;
catch( exception err )
messagebox.show( err.message );
但是如上的寫法在c#中已經屬於過時的寫法,而且也屬於比較低效的寫法。在c#中比較高效而且安全的寫法,應該用as操作符,那麼完成如上類似功能的正確**應該如下。
object objtest = new newtype();
newtype newvalue = objtest as newtype;
那麼很明顯,如上的寫法首先看起來很簡便,至少**數量和強轉方式一樣。至於安全性,對於as操作符來說,它不會做過的轉換操作,當需要轉換物件的型別屬於轉換目標型別或者轉換目標型別的派生型別的時候,那麼此轉換操作才能成功,而且並不產生新的物件。因此用as來進行型別轉換使安全的。為什麼用as操作符進行型別轉換的效率要高於老式的型別轉換的,因為用as操作符進行轉換就如前面所說的,首先判斷當前物件的型別,當型別滿足要求後才進行轉換。而傳統的型別轉換方式,是用當前物件直接去轉換,而且為了保護轉換成功,要加上try-catch,這就決定了它的效率不會高於as操作符的效率。
要注意的時候,不管用傳統方式,還是用as操作符進行型別轉換之後,在使用之前,需要進行判斷轉換是否成功,如下:
if( newvalue!= null )
//work with the object named "newvalue"
但是,使用as操作符有如下幾點限制。
第乙個就是,不用在型別之間進行型別轉化,即如下編寫就會出現編譯錯誤。
newtype newvalue = new newtype();
newtype1 newvalue = newvalue as newtype1;
第二個就是,不能應用在值型別資料,即不能如下寫(也會出現編譯錯誤)。
object objtest = 11;
int nvalue = objtest as int;
對於第一點所提的,可以用傳統的型別轉換方式來完成,但是光用如下的方式,是不能正確完成。
newtypeone newtestone = new newtypeone();
newtypetwo newtesttwo = (newtypetwo)newtestone;
但是光如上寫是不能完成的,要想使如上的操作能正確完成,在原有型別中增加型別轉換操作符函式,即需要完成類似如下的**。
public class newtypeone
public static explicit operator newtypetwo( newtypeone objtest )
//convert object into new type
對於第二點所提的,在c#中可以使用is操作符,再加上老式的型別轉換操作,就可以安全完成轉換,那麼要完成如上操作,正確的寫法如下。
object objtest = 11;
if( objtest is int )
int nvalue = (int)objtest;
除了如上兩點限制外,在用as操作符來進行型別轉換的時候,有個細微的問題。在前面所說的,用as來進行型別轉換的時候,所要轉換的物件型別必須是目標型別或者轉換目標型別的派生型別,那麼這樣就有個問題,即用as操作符來進行型別轉換的時候無法轉換成正確的型別,也就是說本來應該轉換成子型別,卻轉換成了父型別。但是我並不認為這是個嚴重問題,因為在用as操作符來進行型別轉換的時候,如何選擇目標型別在編碼的時候已經很明確了,即用父型別作為目標型別,那麼型別轉換的目的就是轉換成父型別物件進行操作;反之亦然。
在c#中已經提供了乙個很好的型別轉換方式,那麼在進行型別轉換的時候,可以按照如下的方式進行選擇。
型別轉換
使用選擇
object => 已知引用型別
使用as操作符來完成
object => 已知值型別
先使用is操作符來進行判斷,再用型別強轉方式進行轉換
已知引用型別之間轉換
首先需要相應型別提供轉換函式,再用型別強轉方式進行轉換
已知值型別之間轉換
最好使用系統提供的convert類所涉及的靜態方法
c 中new的用法總結
c 中,new的用法很靈活,這裡進行了簡單的總結 1.new 分配這種型別的乙個大小的記憶體空間,並以括號中的值來初始化這個變數 2.new 分配這種型別的n個大小的記憶體空間,並用預設建構函式來初始化這些變數 include include using namespace std int main...
C 中問號 的用法總結
今天看mvc自代的例子時,c 中有兩個奇怪的問號 public accountcontroller iformsauthentication formsauth,imembershipservice service 網上搜下,總結如下 1.可空型別修飾符 引用型別可以使用空引用表示乙個不存在的值,而...
C 中const用法總結
c 中用法總結 1.1.1.定義普通常量 使用 define來定義常量也是常用方法,但const也可以用來定義常量,在 effective c 中建議使用const代替 define來定義常量,因為const定義的常量具有型別資訊,而巨集沒有,所以使用const定義的常量在進行賦值操作時編譯器會進行...