一、明確兩個基本概念
隱式轉換:
a、對於值類型,低精度=>高精度。eg:int=>long
b、對於引用類型,子類向祖宗類轉換過程。eg:對象=>Object
顯式轉換:顯示轉換是隱式轉換的逆過程。
對於c#,與類型轉換相關的其他術語,就不在此處提及,如:
二、為什麼要用is和As
在類型轉換時,對於事先並不知對象的具體類型時,為了避免轉換失敗造成系統崩潰問題,我們一般在容易出現問題或者有可能出現問題(當時並不能確定是否會發生異常)的地方,用try......catch.....finally....來規避程序崩潰等問題,當然這樣做也方便測試,這就是is和as的功能之一,除此之外,對系統進行性能優化時,能不用try....catch....就盡量不用,is和as滿足這一原則。
三、示例
1、is用法
定義:判斷某個對象是否兼容另一個對象。永遠不會拋出異常。
返回值:布爾值。若兼容,則返回true;若不兼容,則為false;若對象為空null,則為false;
例1:兼容 Label lbl = new Label(); if (lbl is Object) { Object objLbl = (Object)lbl; Response.Write("true"); } else { Response.Write("false"); }
測試結果為:true
例2:不兼容 Label lbl = new Label(); if (lbl is TextBox) { Response.Write("true"); } else { Response.Write("false"); } 測試結果為:false
例3:對象為NULL Label lbl = null; if (lbl is Object) { Response.Write("true"); } else { Response.Write("false"); }
測試結果:false
is一般結構:
if (A is B)//第一次兼容檢查 { B b=(B)A;//第二次兼容檢查 }A
分析:對於is,CLR會進行2次兼容性檢查,第一次判斷A is B,若為真,則再次進行兼容檢查B b=(B)A;
2、as用法
定義:判斷某個對象是否兼容另一個對象。永遠不會拋出異常。
返回值:若兼容,則返回結果;若不兼容,則返回null;若為空,則返回null。
例1:兼容
Label lbl1 = new Label(); Label lbl2 =lbl1 as Label; Response.Write(lbl2);//System.Web.UI.WebControls.Label
例2:不兼容
string str = "AS轉換"; Label lbl = str as Label;//顯示編譯錯誤 Response.Write(lbl);
例3:對象為Null Object obj = null; Label lbl = obj as Label; Response.Write(lbl);//null
四、比較
由於CLR對is會進行兩次檢查,對as只進行一次檢查,故as效率要高一些,一般情況下,使用as而不使用is.
參考網址: http://developer.51cto.com/art/200908/145432.htm;http://developer.51cto.com/art/200908/145432.htm