C # 'daki varsayılan boole değeri nedir?


82

Bir boole ( bool) boş olamaz. Ve:

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

Varsayılan değer neden yanlış değil? Peki boş değilse değeri nedir? Nedeni ne?

Düzenleme 1 - Varsayılan değer gerçekten yanlıştır - ancak tüm değişkenler başlatılmalıdır, neden? bu başka bir soru içindir;)

Düzenleme 2 - Resharper ile: private bool foo = false; // Initializing field by default value is redundant???


Yanıtlar:


101

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

C # 'da başlatılmamış değişkenlerin kullanılmasına izin verilmediğini unutmayın.

İle

bool foo = new bool();

foo varsayılan değere sahip olacaktır.

Boole varsayılanı yanlıştır


1
Üzgünüz, eklendi: C # 'da başlatılmamış değişkenlerin kullanılmasına izin verilmediğini unutmayın. Bağlantılı makalede görüldüğü gibi
Destructor

1
Teşekkürler! ve "Düzenleme 2" yi nasıl açıklayabilirsiniz :)
JohnJohnGa

1
varsayılan kurucu çağrılırsa varsayılan değer ayarlanacaktır. Az önce bir değerle yeni bir değişkeni başlattınız. "int i" aynı hatayı -Atanmamış yerel değişkenin kullanımı- atar. Başlatma sırasında değeri ayarlayın veya varsayılan kurucuyu çağırın. bu yüzden herhangi bir sorun yaşamayacaksınız :)
Destructor

1
@Destructor Yorumunuzun biraz kafa karıştırıcı olduğunu düşünüyorum. Resharper'ın nedeni, OP'nin boole alanını başlatmak zorunda olmadığını önermesinin nedeni, bir sınıftaki alanlara otomatik olarak varsayılan değerlerinin atanmasıdır, ancak yerel değişkenler bu değildir. Bkz Hasan cevabını aşağıda.
Alex

26

Temelde yerel değişkenler otomatik olarak başlatılmaz. Bu nedenle, bunları başlatmadan kullanmak bir istisna ile sonuçlanır.

Yalnızca aşağıdaki değişkenler otomatik olarak varsayılan değerlerine başlatılır:

  • Statik değişkenler
  • Sınıf ve yapı örneklerinin örnek değişkenleri
  • Dizi öğeleri

Varsayılan değerler aşağıdaki gibidir (bir sınıfın varsayılan yapıcısına atanır):

  • Başvuru türündeki bir değişkenin varsayılan değeri null şeklindedir.
  • Tam sayı türleri için varsayılan değer 0'dır
  • Karakter için varsayılan değer `\ u0000'dür
  • Float için varsayılan değer 0.0f'dir
  • Çift için varsayılan değer 0.0d'dir
  • Ondalık sayı için varsayılan değer 0,0 m'dir.
  • Bool için varsayılan değer yanlıştır
  • Enum türü için varsayılan değer 0'dır
  • Bir yapı türü için varsayılan değer, tüm değer türü alanlarının varsayılan değerlerine ayarlanmasıyla elde edilir.

Sorunuzun sonraki bölümleriyle ilgili olarak:

  • Varsayılan değerlere otomatik olarak başlatılmayan tüm değişkenlerin başlatılmasının nedeni, derleyici tarafından uygulanan bir kısıtlamadır.
  • private bool foo = false; Bu, bir sınıfın örnek değişkeni olduğu için gerçekten gereksizdir. Bu nedenle bu, varsayılan kurucuda false olarak başlatılır. Dolayısıyla, bunu yanlış yapmanıza gerek yok.

4
Bütünlüğü sağlamak için, MSDN at varsayılan değer tablosu yapı türleri için varsayılan değerleri de ayar içerir diyor "null tüm referans tipi alanları."
Carl Walsh

10

Varsayılan değer gerçekten yanlıştır.

Ancak, önce atanmamış olduğu için yerel bir değişken kullanamazsınız.

Aşağıdakileri doğrulamak için varsayılan anahtar kelimeyi kullanabilirsiniz:

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

4

Bool için varsayılan değer false. Varsayılan değerlerle ilgili harika bir referans için bu tabloya bakın . Kontrol ettiğinizde yanlış olmamasının tek nedeni, onu başlatmanız / true olarak ayarlamanızdır.


0

Bunu deneyin (varsayılan anahtar kelimeyi kullanarak)

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

0

Derleyiciden savunmacı programlama yaklaşımı olarak ele alınabilir - değişkenler kullanılmadan önce atanmalıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.