2008-11-03 56 views
4

這是我寫:C#NullReference異常和ReSharper的建議

if ((lstProperty[i].PropertyIdentifier as string).CompareTo("Name") == 0) 

ReSharper的把我的錯誤(我是新與ReSharper的...我想它),它表明我:

if (((string) lstProperty[i].PropertyIdentifier).CompareTo("Name") == 0) 

爲什麼第二個是NullException安全?對我而言,如果出現空值,這兩者都會崩潰?

回答

8

如果不能執行強制轉換,那麼'as'操作符將返回null,而C風格強制轉換將在無法強制轉換時拋出異常。

我建議打破這一點到多條語句:

string propertyIdentifier = lstProperty[u].PropertyIdentifier as string; 
if(propertyIdentifier != null && propertyIdentifier.CompareTo("Name") == 0) 
{ 
    ... your if statement ... 
} 

ReSharper的不應該抱怨這個,你也不會得到一個NullReferenceException如果PropertyIdentifier爲空或不是一個字符串。

+0

這是我的想法!謝謝 – 2008-11-03 16:02:39

5

這兩個示例都會在相同的情況下成功或失敗,並且當它們成功時,行爲將是相同的。

當它們失敗時,結果會稍有不同:第二個示例稍早失敗(在演員表),另一個示例更具體的例外(InvalidCastExceptionNullReferenceException)。

主要優勢在於調試:當它們失敗時,您會在第二個示例中獲得關於失敗原因的更多信息。具體而言,如果PropertyIdentifier爲null與非string,則可以在第二種情況下進行分析,但不能在第一種情況下進行分析。

另外,如果您處於try/catch中,則可以在與null情況不同的代碼路徑中處理非string大小寫。但是,你可能不應該用這種方式編碼:如果你是這樣,你還在做其他的事。

這可能有助於闡明這種情況,如果你通過下面的代碼在不同的情況下步驟:

var propertyI = lstProperty[i]; 
var propertyIdentifier = propertyI.PropertyIdentifier; 

// pick one of these: 
var propertyIdentifierAsString = propertyIdentifier as string; 
var propertyIdentifierAsString = (string)propertyIdentifier; 

if (propertyIdentifierAsString.CompareTo("Name") == 0) 
+0

感謝有關try/catch +1的信息 – 2008-11-03 16:17:38

相關問題