8

次のようなコードがあるとします。

var someCollection = new int[] {};
var result = someCollection.SingleOrDefault();

次にresult、デフォルト値であるかどうかを判断したいと思います。ただし、要素の型が変更された場合に残りのコードを変更する必要がないように、保守可能な方法でこれを行いたいと考えています。someCollection

これが一般的に行われているように見える方法は(一般的な意味で)result == null. この場合、もちろん、型は参照型ではないため、これは機能しません。

この仮定を回避する改良がresult == default(int). ただし、要素の型を変更するには引数も に変更する必要がdefaultあるため、型を 1 か所だけ変更するという要件はまだ満たされていません。

合否基準

  1. 組み込みロジックは、カスタム ロジックよりも優先されます。
  2. エレガントで簡潔なコードが好まれます。
  3. 効率的なコードが優先されます。(参照型の場合、参照比較のみが発生する必要があります。)
4

3 に答える 3

2

これでうまくいくと思います。

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れたメソッドを呼び出すと思いますが、これは問題になる場合とそうでない場合があります。

于 2013-03-05T23:32:25.843 に答える