[英]What's a maintainable way to determine if a value is set to its type's default value?
說我有一些代碼,如下所示:
var someCollection = new int[] {};
var result = someCollection.SingleOrDefault();
然后我想確定result
是否是默認值。 但是,我希望以可維護的方式這樣做,以便如果someCollection
的元素類型發生更改,則其余代碼不需要更改。
這通常似乎完成的方式(在一般意義上)是result == null
。 當然,在這種情況下,類型不是引用類型,因此這不起作用。
避免這種假設的改進是result == default(int)
。 但是,更改元素類型還需要將參數更改為default
,因此仍然不滿足僅在一個位置更改類型的要求。
您可以使用default關鍵字。 由於您不知道類型是什么,因此您可以使用泛型。
public bool IsDefault<T>(T value)
{
return EqualityComparer<T>.Default.Equals(value, default(T));
}
從山姆偷竊,並改善它:
public static bool IsDefault<T>(this T value)
{
return value == null || value.Equals(default(T));
}
無需進行類型檢查。 JIT會使它工作,因為它知道T在JIT時是什么。
請注意,如果類型重寫為Equals,那么即使它是
default(T)
,它也可能表示為false,即使它不是,也可能表示為true。 - Eric Lippert評論道
我認為這會奏效。
public static bool IsDefault<T>(this T value)
{
var isValueType = typeof(T).IsValueType;
if (isValueType)
return value.Equals(default(T));
else
return value == null;
}
但是,對於值類型,我認為這將調用它們重載的Equals
方法,這可能是也可能不是問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.