2009年8月23日 星期日

C#型別轉換(Casting) - as運算子

當你在C#中作型別轉換時, 可以利用強制轉換的方法, 例如:

double dx = 7.3;
int i = (int) dx;


下面的範例中, 我們在一個控制項(ListBox)的選擇項目事件變更時, 將object(sender)轉型為 ListView.


void ONListBoxSelectinChange(object sender, SelectionChangedEventArgs args)
{
// 將object轉型為ListView
ListView lstView = (ListView)sender;
int TotalCount = lstView.Items.Count;
}
不過當轉型失敗時, 會造成程式當掉, 因此你必須使用trycatch來處理例外錯誤(系統會丟出InvalidCastException例外狀況)

void ONListBoxSelectinChange(object sender, SelectionChangedEventArgs args)
{
try
{
ListView lstView = (ListView)sender;
int TotalCount = lstView.Items.Count;
}
catch (InvalidCastException e)
{
MessageBox.Show(e.Message);
}
}


[圖 1] 使用try catch丟出的例外錯誤


而在C#中提供一個比較簡單的方法, 就是使用as運算子, 這樣作會更有效率也很安全, 如果轉型失敗的話, 它會返回null, 因此, 你可以很容易的來作一些判斷, 如下面的範例所示:



void ONListBoxSelectinChange(object sender, SelectionChangedEventArgs args)
{
ListView lstView = sender as ListView;

if (lstView == null)
{
MessageBox.Show("Could not convert object to ListView");
}
else
{
int TotalCount = lstView.Items.Count;
}
}

參考資料:
HOW TO:使用 as 和 is 運算子進行安全轉型 (C# 程式設計手冊)
Effective c# Item3:運算子is或as優於强制轉型

沒有留言:

張貼留言