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.