2009-04-10 61 views
7
「默認」關鍵字

我寫了下面的方法從序列化類的列表返回不可序列化的類(LINQ類)的列表(波蘇斯):C#泛型

List<UnSerializableEntity> ToListOfUnserializables(List<SerializableEntity> entityList) 
{ 
    var tempList = new List<UnSerializableEntity>(); 
    entityList.ForEach(e => 
    { 
     if (e != null) 
     { 
      tempList.Add(ConvertFromSerializableToUnserializable(e)); 
     } 
    }); 
    return tempList; 
} 

現在,ReSharper的具有「抱怨」這個行:if (e != null),並建議將其改成這樣:

if (!Equals(e, default(SerializableEntity))) 

我的問題是什麼這種變化實際上改善或防止發生?,我知道在這種情況下的默認關鍵字必須做一些泛型,但我不確定它代表什麼。

PS。 UnSerializableEntitySerializableEntity是類泛型。

回答

13

如果SerializableEntity是值類型,它永遠不可能是null。因此,您的if語句的主體將始終執行,因爲它正在檢查nulldefault關鍵字將返回通用類型的默認值。對於參考類型,默認值爲null。對於值類型,它是零(或者該值類型的任何零代表)。

如果你只想引用類型作爲實體,你應該對你的通用參數設置約束。例如:

List<UnSerializableEntity> ToListOfUnserializables(List<SerializableEntity> entityList) 
    where SerializableEntity : class 
+0

但他的if語句檢查值是_not_ null,所以這將意味着它會總是執行? – sisve 2009-04-10 14:50:44

+0

「if」塊永遠不會執行:值類型將拋出異常。 – 2009-04-10 14:54:07

+0

@Simon語句e!= null和!Equals(e,default(SerializableEntity))在e不爲空時爲true/default – 2009-04-10 15:07:20

4

肯特的反應是準確的,但更明確地回答你的問題有關ReSharper的,爲什麼它的抱怨:

在引用類型(類)的情況下空檢查就足夠了,因爲這被認爲是參考類型的「默認」值。但是,對於一個值類型(比如一個結構體),「default」不會爲空。因此,由於您的SerializableEntity和UnSerializableEntity是泛型,因此您可以將它們指定爲引用或值類型,因此null檢查您的操作可能不是您想要的。你想要檢查的是確保參數是你真正想要關注的東西。在引用類型的情況下,您不希望關注空對象。在值類型的情況下,您不希望關注「零值」值。

例如:假設你指定一個DateTime作爲你正在處理的數據類型。你真的想添加沒有設置任何值的日期時間嗎?日期時間的默認值是1/1/0001,非空,所以你需要檢查使用if (!Equals(e, default(SerializableEntity)))if (e != null)