Jaka jest domyślna wartość logiczna w języku C #?


82

Wartość logiczna ( bool) nie może mieć wartości null. I:

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

Dlaczego wartość domyślna nie jest fałszywa? Jaka jest więc wartość, jeśli nie jest zerowa? Jaki jest powód?

Edycja 1 - Wartość domyślna to rzeczywiście fałsz - ale wszystkie zmienne powinny zostać zainicjowane, dlaczego? to na inne pytanie;)

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


Odpowiedzi:


101

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

Pamiętaj, że używanie niezainicjowanych zmiennych w C # jest niedozwolone.

Z

bool foo = new bool();

foo będzie miało wartość domyślną.

Wartość logiczna to fałsz


1
Przepraszamy, dodano: Pamiętaj, że używanie niezainicjowanych zmiennych w C # jest niedozwolone. Jak widać w powiązanym artykule
Destructor,

1
Dzięki! a więc jak możesz wyjaśnić moje „Edit 2” :)
JohnJohnGa

1
wartość domyślna zostanie ustawiona, jeśli zostanie wywołany domyślny konstruktor. Właśnie zainicjowałeś nową zmienną z wartością. „int i” zwróci ten sam błąd -Użycie nieprzypisanej zmiennej lokalnej-. Ustaw wartość podczas inicjowania lub wywołaj domyślny konstruktor. więc nie będziesz miał żadnych problemów :)
Destructor

1
@Destructor Myślę, że twój komentarz jest nieco zagmatwany. Powodem, dla którego resharper sugeruje, że OP nie musi inicjować pola boolowskiego, jest to, że polom w klasie są automatycznie przypisywane wartości domyślne, a zmienne lokalne nie. Zobacz odpowiedź Hasana poniżej.
Alex

26

Zasadniczo zmienne lokalne nie są inicjalizowane automatycznie. Dlatego użycie ich bez inicjalizacji spowodowałoby wyjątek.

Tylko następujące zmienne są automatycznie inicjowane do wartości domyślnych:

  • Zmienne statyczne
  • Zmienne instancji instancji klas i struktur
  • Elementy tablicy

Wartości domyślne są następujące (przypisane w domyślnym konstruktorze klasy):

  • Domyślną wartością zmiennej typu referencyjnego jest null.
  • W przypadku typów całkowitych wartość domyślna to 0
  • Wartość domyślna dla znaku to `\ u0000 '
  • W przypadku liczby zmiennoprzecinkowej domyślną wartością jest 0,0f
  • W przypadku double wartość domyślna to 0,0d
  • W przypadku dziesiętnych wartość domyślna to 0,0 m
  • W przypadku bool wartością domyślną jest false
  • W przypadku typu wyliczenia wartość domyślna to 0
  • W przypadku typu struktury wartość domyślna jest uzyskiwana przez ustawienie wszystkich pól typu wartości na ich wartości domyślne

Jeśli chodzi o dalsze części pytania:

  • Powodem, dla którego wszystkie zmienne, które nie są automatycznie inicjowane do wartości domyślnych, powinny być inicjowane, jest ograniczenie narzucone przez kompilator.
  • private bool foo = false; Jest to rzeczywiście zbędne, ponieważ jest to zmienna instancji klasy. W związku z tym zostałby zainicjowany jako false w domyślnym konstruktorze. Dlatego nie ma potrzeby ustawiania tego jako fałszywego siebie.

4
Aby uzyskać kompletność, w tabeli wartości domyślnych w witrynie MSDN podano , że wartości domyślne dla typów struktur obejmują również ustawienie „wszystkich pól typu odwołania na wartość null”.
Carl Walsh

10

Wartością domyślną jest rzeczywiście fałsz.

Nie możesz jednak użyć zmiennej lokalnej, jeśli nie została przypisana jako pierwsza.

Możesz użyć domyślnego słowa kluczowego, aby zweryfikować:

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

4

Domyślna wartość bool to false. Zobacz tę tabelę, aby uzyskać doskonałe informacje na temat wartości domyślnych. Jedynym powodem, dla którego nie byłby to fałsz, gdy to sprawdzasz, jest zainicjowanie / ustawienie wartości true.


0

Spróbuj tego (używając domyślnego słowa kluczowego)

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

0

Można to traktować jako defensywne podejście kompilatora do programowania - zmienne muszą być przypisane, zanim będzie można ich użyć.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.