簡體   English   中英

確定某個值是否設置為其類型的默認值的可維護方法是什么?

[英]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 ,因此仍然不滿足僅在一個位置更改類型的要求。

驗收標准

  1. 內置邏輯優於自定義邏輯。
  2. 優雅而簡潔的代碼是首選。
  3. 有效的代碼是首選。 (對於參考類型,只應進行參考比較。)

您可以使用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.

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