[ASP.NET]關於強制轉型及as的二三事
相信對於強制轉型及as的用法在開發中大家應該都常用到,尤其在fincdcontrol
的時候,來看看幾種寫法(以GridView FindControl為例)
(1)
if (e.Row.FindControl("CheckBox_All") != null)
{
CheckBox chk = e.Row.FindControl("xxx") as CheckBox;
....
....
....
}
(2)
CheckBox chk = e.Row.FindControl("xxx") as CheckBox;
if(chk!=null)
{
....
....
....
}
(3)
if (e.Row.FindControl("CheckBox_All") != null)
{
CheckBox chk = (CheckBox)e.Row.FindControl("xxx");
....
....
....
}
第(1)(2)的寫法跟(3)的寫法差別在於(3)寫法是以強制轉型,而(1)(2)則是以as來進行
另外(1)跟(2)的寫法差別在於(1)先判斷找不找的到xxx這個Control。
以上的寫法可能在一般情況都可以運行,可能也很少會遇到引發生錯誤,那什麼寫法
是比較好的呢?
我們先看一下強制轉型,以上面的例子來看當我們必須明確知道Control是CheckBox
,在這先決條件下我們直接付予(CheckBox)做強制轉型才會不引發Exception,而引發
Exception是耗成本的。另外當類型間依靠explicit operator轉換運算子時,『explicit
關鍵字會宣告必須以轉型 (cast) 叫用的使用者定義型別轉換運算子』,也必須運用強制轉型。
public partial class ConvertType : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Car car1 = new Car();
car1.No = "ABC-123";
Bus bus1 = new Bus();
bus1 = (Bus)car1;
//bus1 = car1 as Bus(); //編譯階段即會發生錯誤
Response.Write(bus1.No);
}
}
class Car
{
public string No { get; set; }
}
class Bus
{
public string No { get; set; }
public static explicit operator Bus(Car car)
{
Bus bus = new Bus(){No=car.No};
return bus;
}
}
而用as進行轉型則永遠不會引發Exception,當來源是null或是轉型根本就失敗時,最後的結果都
會是null。因此從這裡初步我們可以得到一個結論,除了在非得用強制轉型的情況下,不然會比較
推薦以as來進行轉型,接著再回到最一開始的例子來看:
寫法(1),一開始就做判斷了是否能find到control,接著再做as轉型,實際上有些多餘,應該可以修
正為寫法(2)的樣子,直接以as轉型後再判斷是否為null,而寫法(3)即使一開始就判斷了是否能find
到control才進行強制轉型,但強制轉型仍然可能因為轉型失敗而引發Exception,因此應該要增加try
catch的判斷,又或是先以is進行判斷後再做強制轉型來避免引發Exception。因此以這個例子來說寫
法(2)相較於其它二者,會是比較好的。
以上若有認知錯誤請不吝指正 :)
Ref:
By No.18