Яке булеве значення за замовчуванням у C #?


83

Логічне значення ( bool) не може бути нульовим. І:

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

Чому значення за замовчуванням не є хибним? То яке значення, якщо воно не є нульовим? В чому причина?

Редагувати 1 - Значення за замовчуванням дійсно хибне - але всю змінну слід ініціалізувати, чому? це для іншого питання;)

Редагувати 2 - з Resharper: private bool foo = false; // Initializing field by default value is redundant???


1
Ви могли б знайти blogs.msdn.com/b/ericlippert/archive/2009/10/12 / ... цікавого
AakashM

Відповіді:


102

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

Пам'ятайте, що використання неініціалізованих змінних у C # заборонено.

С

bool foo = new bool();

foo матиме значення за замовчуванням.

Логічне значення за замовчуванням - false


1
На жаль, додано: Пам’ятайте, що використання неініціалізованих змінних у C # заборонено. Як видно з посилання на статтю
Destructor

1
Дякую! і так як ви можете пояснити мій "Редагування 2" :)
JohnJohnGa

1
значення за замовчуванням буде встановлено, якщо буде викликаний конструктор за замовчуванням. Ви щойно ініціалізували нову змінну зі значенням. "int i" видасть ту саму помилку -Використання непризначеної локальної змінної-. Встановіть значення при ініціалізації або викличте конструктор за замовчуванням. так що у вас не буде проблем :)
Destructor

1
@Destructor Я думаю, що ваш коментар трохи заплутаний. Причина resharper передбачає, що OP не повинен ініціалізувати логічне поле, тому що полям класу автоматично присвоюється значення за замовчуванням, а локальні змінні не є. Дивіться відповідь від Hasan нижче.
Алекс

26

В основному локальні змінні не ініціалізуються автоматично. Отже, використання їх без ініціалізації призведе до винятку.

Лише наступні змінні автоматично ініціалізуються до значень за замовчуванням:

  • Статичні змінні
  • Змінні екземпляра екземплярів класу та структури
  • Елементи масиву

Значення за замовчуванням такі (призначені в конструкторі класу за замовчуванням):

  • Значення за замовчуванням для змінної контрольного типу є нульовим.
  • Для цілочисельних типів значення за замовчуванням - 0
  • Для char значення за замовчуванням - `\ u0000 '
  • Для float значення за замовчуванням 0,0f
  • Для подвійного значення за замовчуванням 0,0d
  • Для десяткового значення за замовчуванням 0,0м
  • Для bool значенням за замовчуванням є false
  • Для типу перечислення значення за замовчуванням - 0
  • Для типу struct значення за замовчуванням отримується шляхом встановлення для всіх полів типу значення значень за замовчуванням

Що стосується пізніших частин Вашого запитання:

  • Причиною того, чому всі змінні, які не ініціалізуються автоматично до значень за замовчуванням, слід ініціалізувати, є обмеження, накладене компілятором.
  • private bool foo = false; Це дійсно зайве, оскільки це змінна екземпляра класу. Отже, це буде ініціалізоване значення false у конструкторі за замовчуванням. Отже, не потрібно самому встановлювати це як фальшиве.

4
Для повноти таблиця значень за замовчуванням у MSDN говорить, що значення за замовчуванням для типів структур також включає встановлення "для всіх полів типу посилання на нуль".
Carl Walsh

10

Значення за замовчуванням дійсно хибне.

Однак ви не можете використовувати локальну змінну, оскільки вона не була призначена першою.

Ви можете використовувати ключове слово за замовчуванням для перевірки:

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

4

Значення за замовчуванням для bool - false. У цій таблиці ви знайдете чудові посилання на значення за замовчуванням. Єдина причина, коли вона не буде хибною при її перевірці, полягає в тому, що ви ініціалізуєте / встановите її на true.


0

Спробуйте це (за допомогою ключового слова за замовчуванням)

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

0

Це може трактуватися як захисний підхід програмування від компілятора - перед використанням змінні повинні бути призначені.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.