[ASP.NET]關於強制轉型及as的二三事

  • 6432
  • 0

[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:

explicit (C# 參考)

 

 

 

若本文對您有所幫助,歡迎轉貼,但請在加註【轉貼】及來源出處,並在附上本篇的超連結,感恩您的配合囉。

By No.18