今天寫代碼的時候,突然遇到一個問題,即類型轉換。C#提供的類型轉換有強制轉換和採用 as進行轉換。
那問題就來了,在一個物件類型確定的情況下,對它進行類型轉換是採用強制轉換還是採用as進行轉換。如以下情況:
Code
using System.Collections;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Hashtable table = new Hashtable();
table.Add(1, "測試字串");
string result1 = table[1] as string;
string result2 = (string)table[1];
}
}
}
在確定hashtable值的類型為字串的情況下,用那種方式效率會高一點?
我的第一反映是google一下,google了十幾分鐘,沒有找到滿意的答案。不過有一個說明是這樣的,在類型轉換時,as首先進行類型判斷,如果轉換成功返指定類型的結果,如過類型不相容,則返回空。而強轉不進行類型判斷,轉換失敗後會拋出異常,所以在強制轉換類型是需加入異常處理。代碼如下:
try
{
string result2 = (string)table[1];
}
catch (Exception e)
{
throw e;
}
這樣看來還是採用as好,但是在類型確定的情況下,即table的值只會是字串,不會是其它類型或空的情況下,在強轉時就不用加異常判斷。那麼用as還是強制轉換呢?問題沒有解決,我想到看看as和強轉的IL代碼,看是否能找到相關線索。以上代碼的IL代碼我就不貼出來了,就把關鍵的代碼貼出來。如下:
IL_0025: isinst [mscorlib]System.String
IL_002a: stloc.1
IL_0037: castclass [mscorlib]System.String
IL_003c: stloc.2
問題出來了,即as和強制轉換的區別是兩個關鍵的不同,isinst和castclass。除了關鍵字的不同,找不到其它的了,IL並沒有告訴我答案,IL代碼和C#代碼沒太大區別。在去google一下兩個關鍵字的說明名解釋。沒有找到滿意的答案。
希望園子裡的高手能幫小弟回答這個問題,在類型確定的情況下,是採用as做類型轉換還是強制轉換。