問一個C#編程中常用代碼

來源:互聯網
上載者:User

今天寫代碼的時候,突然遇到一個問題,即類型轉換。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做類型轉換還是強制轉換。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.