繁体中文
设为首页
加入收藏
当前位置:.Net技术首页 >> 面向对象编程 >> 安全轉換參考型別(转)

安全轉換參考型別(转)

2004-10-01 08:26:10  作者:  来源:互联网  浏览次数:27  文字大小:【】【】【
简介:對初學者來說經常造成初學者問題的是參考型別(reference types )的轉換(conversion),關於這點在C++ 造成相當的困擾更是如此,幸運的是,在 C# 中不會發生。盡管是或是因為此種型別安全語言,對於不同的技術都應?..
关键字:安全

對初學者來說經常造成初學者問題的是參考型別(reference types )的轉換(conversion),關於這點在C++ 造成相當的困擾更是如此,幸運的是,在 C# 中不會發生。盡管是或是因為此種型別安全語言,對於不同的技術都應該要有所認識。

轉型

is 運算子

as 運算子

為了能夠更清楚說明這個主題,我選擇一個很不錯的例子:我們試著將 apples 轉換成 oranges - 某些地方是 C# 不允許的(因此較適合用來說明如何處理轉換錯誤) 所有範例的基本程式碼架構如下 (classes.aspx):

<% @page language=c# %>

<%

apple myApple = new apple();

orange myOrange = new orange();

Response.Write(myApple.Fruit()+"
");

Response.Write(myOrange.Fruit()+"
");

%>

轉型 (Casting)

即使我們會失敗,我們所先會試著去解決:

apple myApple = new apple();

orange anotherOrange = (orange)myApple;

上面程式碼編譯器會抱怨:它知道這個轉換是無效的,甚至不會去編譯程式碼。 理由很清楚,就是 apple class 與 orange class 根本沒有相同之處。

所以我們將選擇另一個較實際的方法 - 首先將型別存放在一般 object 變數中(例如當將元素存放在堆疊 (Stack),Queues 或 ArrayLists 中), 之後在轉換成可再使用的適當型別:

apple myApple = new apple();

// the following line stands for potentially more complicated operations

object objGeneral = myApple;

orange anotherOrange = (orange)objGeneral;

當選擇了錯誤型別 - 就如我們所做的,C# 可能就不允許這樣 - 也就是說在執行時期可藉由InvalidCastException,要能適當捕獲錯誤,例外處理程式碼是必須的,例如:

apple myApple = new apple();

object objGeneral = myApple;

try

{

orange anotherOrange = (orange)objGeneral;

// do whatever you want with the orange

}

catch(InvalidCastException e)

{

// either do nothing or tell the user

}

即使是所有的錯誤都處理了,在這例外處理中我只發現到一失敗地方。如果我能夠事先的 要求轉型是否成功,可能情況會更好更方便。這也就是為何 is 運算子會派上用場之處。

is 運算子

因為已經宣告了,is 運算子允許要求轉型是否成功或是產生例外。 下面這段小程式說明 is 運算子如何在應用程式中使用:

apple myApple = new apple();

object objGeneral = myApple;

if (objGeneral is orange)

{

orange anotherOrange = (orange)objGeneral;

// do whatever you want with the orange

}

else

{

Response.Write("this is no orange");

}

我想給一個關於is 運算子的提示 - 如果在編譯執行時候可以決定轉換 不是成功就是失敗的話 - 關於這一點我們很遺憾的是在 ASP.NET 看不到。

as 運算子

as 運算子可以稱作是 exception-less cast。轉換會暗地執行 - 萬一轉換失敗,要轉換的目標變數就會設成null。所有剩下的工作就 是使用 if-statement 陳述來檢查這個變數:

apple myApple = new apple();

object objGeneral = myApple;

orange anotherOrange;

anotherOrange = objGeneral as orange;

if (null != anotherOrange)

{

// do whatever you want with the orange

}

else

{

Response.Write("this is no orange");

}

對 as 運算子來說道理就如同 is 運算子一樣 - 如果轉換成功或是失敗,你會收到警告訊息。 例如這個程式碼:

apple myApple = new apple;

apple anotherApple = myApple as apple;

結論

條條道路通羅馬,到羅馬的道路可以有好幾條路,然而有些道路會比其他道路曲折。 對於型別轉換我個人最喜歡的方法是用 is運算子。

责任编辑:admin
相关文章