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


100

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

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

class MyClass
{
    public int? MyNullableInt;
}

(答えはほぼ確実にかのどちらnull0であるようですが、どれが正しいですか?)


9
なぜ反対票か。(この質問への答えは、実際に動作をテストするコードを実行しない限り、最初は私には明白ではありませんでした。驚いたことに、StackOverflowでこの質問の重複を見つけることができなかったか、Google経由で他の場所で簡単に見つけることができませんでした。)
ジョンシュナイダー

1
あなたはここを見かもしれません-私にとって最初のグーグルヒット。
内部サーバーエラー

2
@ 500-私が調査しているときにその記事を見つけました-実際に以下の自分の答えでそれにリンクしました-しかし、私の知る限り、記事はnull許容型のインスタンスのデフォルト値であることを明示的に述べていません無効です。それはない「hasValueは、デフォルト値はfalseです。ザ・Valueプロパティにはデフォルト値はありません」と言うが、それは直接、いくつかの追加掘削せずに私の元の質問に答えていません。
Jon Schneider

2
ブレークポイントを設定して値が何であるか、またはイミディエイトウィンドウタイプint? x;で結果が何であるかを確認できるためでしょうか。
Rufus L

回答:


135

int?-および「type?」を使用するnull許容型のデフォルト値。宣言-ですnull

なぜこれが当てはまるのか:

  • int?構造体Nullable <T>(Tはint)の構文シュガーです。(参考
  • Nullable<T>タイプがありブールhasValueはのメンバー、false、作るNullable<T>インスタンス「のような行為」null値を。特に、Nullable <T> .EqualsメソッドtrueNullable<T>with HasValue == falseが実際のnull値と比較されるときに返されるようにオーバーライドされます。
  • C#言語仕様11.3.4、構造体のインスタンスの初期デフォルト値はデフォルト値に設定され、その構造体の値型フィールドの全てであり、その構造体の参照型フィールドのすべてがに設定しますnull
  • boolC#の変数のデフォルト値はfalsereference)です。したがって、HasValueデフォルトのNullable<T>インスタンスのプロパティはfalseです。これにより、Nullable<T>インスタンス自体がのように動作しますnull

私はからの宣言を変更するときint? x = null;int? x;、私はさらに下のコードでコンパイルエラーが発生します:「未割り当てのローカル変数xの使用」。
ジョンピック

1
@JohnPickこれは、変数を使用する前に初期化することを「忘れる」ことから発生する可能性のあるバグを防ぐことを目的としたC#コンパイラの機能です。あなたが状況することができます初期化されていないint型に遭遇?クラスメンバー変数の場合です。ここでは、両方の例:blogs.msdn.microsoft.com/abhinaba/2005/11/08/...
ジョン・シュナイダー

基本的に、この場所はあなたの技術系ブログですか?答えを得るためにコードを実行する必要があるだけの質問をし、それから同じ質問で自分自身に答えます。
後藤

4
フェア十分@JonSchneider、その後、私の悪い
後藤

VSのコンパイラーのヒント/警告は誤解を招くものですField 'id' is never assigned to, and will always have its default value 0。変だよね?
ヘンディイラワン2017

30

別名値Nullable<T>.GetValueOrDefault()を使用する数学計算を扱うときに特に便利な方法を共有することが重要だと感じました。プロパティをチェックする必要がなく、代わりに使用できることがよくあります。Nullable<int>int?HasValueGetValueOrDefault()

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());

上記のコードが機能するコマンドライン


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.