web-dev-qa-db-ja.com

null許容型「int」のデフォルト値は何ですか? (疑問符を含む)?

C#では、int?型のクラスインスタンス変数のデフォルト値は何ですか?

たとえば、次のコードでは、明示的に割り当てられない場合、MyNullableIntはどの値になりますか?

class MyClass
{
    public int? MyNullableInt;
}

(答えはほぼ確実にnullまたは0のいずれかである可能性が高いようですが、それはどれですか?)

85
Jon Schneider

int?のデフォルト値-および「タイプ?」を使用するNULL可能タイプのデフォルト値宣言-nullです。

なぜそうなのか:

  • int?は、構造体の型 Nullable <T> (Tはint)の構文糖衣です。 ( 参照
  • Nullable<T>型には bool HasValue メンバーがあり、これはfalseのときにNullable<T>インスタンスをnull値のように動作させます。特に、 Nullable <T> .Equalsメソッド は、Nullable<T> with HasValue == falseが実際のtrue値と比較されるときに、nullを返すようにオーバーライドされます。
  • C#Language Specification 11.3.4 から、構造体インスタンスの初期デフォルト値は、その構造体のすべての値型フィールドがデフォルト値に設定され、その構造体のすべての参照型フィールドがnullに設定されます。
  • C#のbool変数のデフォルト値はfalse(- reference )です。したがって、デフォルトのNullable<T>インスタンスのHasValueプロパティはfalseです。これにより、Nullable<T>インスタンス自体がnullのように動作します。
119
Jon Schneider

Nullable<int> aka int?の値を使用する数学計算を扱うときに特に便利なNullable<T>.GetValueOrDefault()メソッドを共有することが重要だと感じました。 HasValueプロパティをチェックする必要がない場合が多く、代わりにGetValueOrDefault()を使用できます。

var defaultValueOfNullableInt = default(int?);
Console.WriteLine("defaultValueOfNullableInt == {0}", (defaultValueOfNullableInt == null) ? "null" : defaultValueOfNullableInt.ToString());

var defaultValueOfInt = default(int);
Console.WriteLine("defaultValueOfInt == {0}", defaultValueOfInt);

Console.WriteLine("defaultValueOfNullableInt.GetValueOrDefault == {0}", defaultValueOfNullableInt.GetValueOrDefault());

Command line showing the code above working

22
Brian Ogden
var x = default (int?);
Console.WriteLine("x == {0}", (x == null) ? "null" : x.ToString());
0
Rufus L