Was ist der Standard-Boolesche Wert in C #?


82

Ein boolean ( bool) kann nicht null sein. Und:

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

Warum ist der Standardwert nicht falsch? Was ist der Wert, wenn er nicht null ist? Was ist der Grund?

Bearbeiten 1 - Der Standardwert ist zwar falsch - aber alle Variablen sollten initialisiert werden. Warum? das ist für eine andere Frage;)

Edit 2 - mit Resharper: private bool foo = false; // Initializing field by default value is redundant???


Antworten:


101

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

Denken Sie daran, dass die Verwendung nicht initialisierter Variablen in C # nicht zulässig ist.

Mit

bool foo = new bool();

foo hat den Standardwert.

Der boolesche Standardwert ist false


1
Entschuldigung, hinzugefügt: Denken Sie daran, dass die Verwendung nicht initialisierter Variablen in C # nicht zulässig ist. Wie im verlinkten Artikel zu sehen
Destructor

1
Vielen Dank! und so wie du mein "Edit 2" erklären kannst :)
JohnJohnGa

1
Der Standardwert wird festgelegt, wenn der Standardkonstruktor aufgerufen wird. Sie haben gerade eine neue Variable mit einem Wert initialisiert. "int i" löst den gleichen Fehler aus - Verwendung einer nicht zugewiesenen lokalen Variablen -. Legen Sie den Wert beim Initialisieren fest oder rufen Sie den Standardkonstruktor auf. Sie werden also keine Probleme haben :)
Destructor

1
@Destructor Ich finde deinen Kommentar etwas verwirrend. Der Grund, warum resharper vorschlägt, dass OP das boolesche Feld nicht initialisieren muss, liegt darin, dass Feldern in einer Klasse automatisch ihr Standardwert zugewiesen wird, was bei lokalen Variablen nicht der Fall ist. Siehe die Antwort von Hasan unten.
Alex

25

Grundsätzlich werden lokale Variablen nicht automatisch initialisiert. Daher würde die Verwendung ohne Initialisierung zu einer Ausnahme führen.

Nur die folgenden Variablen werden automatisch auf ihre Standardwerte initialisiert:

  • Statische Variablen
  • Instanzvariablen von Klassen- und Strukturinstanzen
  • Array-Elemente

Die Standardwerte lauten wie folgt (im Standardkonstruktor einer Klasse zugewiesen):

  • Der Standardwert einer Variablen vom Referenztyp ist null.
  • Für ganzzahlige Typen ist der Standardwert 0
  • Für char lautet der Standardwert "\ u0000".
  • Für float ist der Standardwert 0.0f
  • Für double ist der Standardwert 0.0d
  • Für Dezimalstellen beträgt der Standardwert 0,0 m
  • Für bool ist der Standardwert false
  • Für einen Aufzählungstyp ist der Standardwert 0
  • Für einen Strukturtyp wird der Standardwert erhalten, indem alle Werttypfelder auf ihre Standardwerte gesetzt werden

Soweit spätere Teile Ihrer Frage betroffen sind:

  • Der Grund, warum alle Variablen, die nicht automatisch auf Standardwerte initialisiert werden, initialisiert werden sollten, ist eine vom Compiler auferlegte Einschränkung.
  • private bool foo = false; Dies ist in der Tat redundant, da dies eine Instanzvariable einer Klasse ist. Daher würde dies im Standardkonstruktor auf false initialisiert. Daher müssen Sie dies nicht so einstellen, dass Sie selbst falsch sind.

4
Der Vollständigkeit halber wird in der Standardwertetabelle bei MSDN angegeben , dass die Standardwerte für Strukturtypen auch das Setzen von "Alle Referenztypfelder auf Null" umfassen.
Carl Walsh

10

Der Standardwert ist in der Tat falsch.

Sie können eine lokale Variable jedoch nicht verwenden, da sie nicht zuerst zugewiesen wurde.

Sie können das Standardschlüsselwort verwenden, um Folgendes zu überprüfen:

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

4

Der Standardwert für bool ist false. In dieser Tabelle finden Sie eine gute Referenz zu Standardwerten. Der einzige Grund, warum es nicht falsch wäre, wenn Sie es überprüfen, ist, wenn Sie es initialisieren / auf true setzen.


0

Versuchen Sie dies (mit dem Standardschlüsselwort)

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

0

Es kann vom Compiler als defensiver Programmieransatz behandelt werden - die Variablen müssen zugewiesen werden, bevor sie verwendet werden können.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.