C#のデフォルトのブール値は何ですか?


82

ブール値(bool)をnullにすることはできません。そして:

bool foo; if(foo){} // Use of unassigned local variable 'foo'

デフォルト値がfalseではないのはなぜですか?では、nullでない場合の値は何ですか?理由は何ですか?

編集1-デフォルト値は確かにfalseです-しかし、すべての変数を初期化する必要があります、なぜですか?これは別の質問です;)

編集2-Resharperで:private bool foo = false; // Initializing field by default value is redundant???


1
blogs.msdn.com/b/ericlippert/archive/2009/10/12/…おもしろいと思うかもしれません
AakashM 2011

回答:


101

http://msdn.microsoft.com/en-us/library/83fhsxwc.aspx

C#で初期化されていない変数を使用することは許可されていないことに注意してください。

bool foo = new bool();

fooはデフォルト値になります。

ブールデフォルトはfalseです


1
申し訳ありませんが、追加:C#で初期化されていない変数を使用することは許可されていないことに注意してください。リンクされた記事に見られるように
デストラクタ

1
ありがとう!そして、私の「編集2」をどのように説明できるか:)
JohnJohnGa 2011

1
デフォルトのコンストラクターが呼び出されると、デフォルト値が設定されます。新しい変数を値で初期化しました。「inti」は同じエラーをスローします-割り当てられていないローカル変数の使用-。初期化時に値を設定するか、デフォルトのコンストラクターを呼び出します。したがって、問題は発生しません:)
デストラクタ

1
@Destructorあなたのコメントは少し紛らわしいと思います。resharperが、OPがブールフィールドを初期化する必要がないことを示唆している理由は、クラス内のフィールドには、ローカル変数にはないデフォルト値が自動的に割り当てられるためです。以下のHasanから回答を参照してください。
アレックス

26

基本的に、ローカル変数は自動的に初期化されません。したがって、初期化せずにそれらを使用すると、例外が発生します。

次の変数のみが自動的にデフォルト値に初期化されます。

  • 静的変数
  • クラスインスタンスと構造体インスタンスのインスタンス変数
  • 配列要素

デフォルト値は次のとおりです(クラスのデフォルトコンストラクターで割り当てられます)。

  • 参照型の変数のデフォルト値はnullです。
  • 整数型の場合、デフォルト値は0です。
  • charの場合、デフォルト値は `\ u0000 'です。
  • floatの場合、デフォルト値は0.0fです。
  • doubleの場合、デフォルト値は0.0dです。
  • 10進数の場合、デフォルト値は0.0mです。
  • boolの場合、デフォルト値はfalseです
  • 列挙型の場合、デフォルト値は0です。
  • 構造体タイプの場合、デフォルト値は、すべての値タイプフィールドをデフォルト値に設定することによって取得されます

あなたの質問の後の部分が懸念されている限り:

  • デフォルト値に自動的に初期化されないすべての変数を初期化する必要がある理由は、コンパイラーによって課せられる制限です。
  • private bool foo = false; これはクラスのインスタンス変数であるため、これは確かに冗長です。したがって、これはデフォルトのコンストラクターでfalseに初期化されます。したがって、これを自分でfalseに設定する必要はありません。

4
完全を期すために、MSDNのデフォルト値の表には、構造体タイプのデフォルト値には「すべての参照タイプフィールドをnullに設定する」ことも含まれていると記載されています。
カールウォルシュ

10

デフォルト値は確かにfalseです。

ただし、ローカル変数は最初に割り当てられていないため、使用できません。

デフォルトのキーワードを使用して、以下を確認できます。

bool foo = default(bool);
if (!foo) { Console.WriteLine("Default is false"); }

4

boolのデフォルト値はfalseです。デフォルト値の優れたリファレンスについては、この表を参照してください。チェックしたときにfalseにならない唯一の理由は、初期化/ trueに設定した場合です。


0

これを試してください(デフォルトのキーワードを使用)

 bool foo = default(bool); if (foo) { } 

0

これは、コンパイラからの防御的なプログラミングアプローチとして扱うことができます。使用する前に変数を割り当てる必要があります。

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