簡體   English   中英

C# 中的對象轉換

[英]Object Casting in C#

有什么區別以及優缺點

 LinkButton lb = (LinkButton)ctl;

 LinkButton lb = ctl as LinkButton;

我嘗試使用第一個,但它給了我錯誤,然后我用關鍵字 as 嘗試了另一個,它工作得很好。

先感謝您。

第一個是顯式轉換,第二個是轉換。 如果as關鍵字的轉換失敗,它將簡單地返回null而不是拋出異常。

這是每個的文檔:

請注意,在上面的鏈接文檔中,他們聲明as關鍵字不支持用戶定義的轉換。 +1 到 Zxpro :) 這就是用戶定義的轉換:

用戶定義的轉換教程

我對使用as運算符與直接強制轉換的通常指導如下:

  1. 如果強制轉換必須成功(即,如果強制轉換失敗,繼續執行將是錯誤的),請使用直接強制轉換。
  2. 如果強制轉換可能失敗並且需要對此進行編程檢測,請使用as運算符。

以上適用於引用類型。 對於值類型(如boolint ), as不起作用。 在這種情況下,您需要使用is檢查來執行“安全轉換”,如下所示:

if (x is int y)
{
   // y is now a int, with the correct value

}
else
{
    // ...
}

我不建議嘗試捕獲InvalidCastException ,因為這通常是程序員錯誤的標志。 請改用上述指南。

我相信,如果使用第一種方法無法正確轉換對象(嘗試轉換錯誤類型),則使用第一種方法進行轉換會引發異常,而如果無法正確轉換,則使用 as 關鍵字只會將變量設置為 null。

因此,請確保如果您使用 as 關鍵字強制轉換,請檢查

if(lb == null)
    return null; // or throw new Exception()

如果你使用 () 演員表,你用

try
{
    LinkButton lb = (LinkButton)ctl;
}
catch(InvalidCastException ex)
{
    //TODO: Handle Exception
}

第二個稱為安全轉換,它不會拋出異常,而是將“null”放入您的變量中。 所以它不能正常工作,但將您的LinkButton lb為 null

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM