Яке булеве значення за замовчуванням у 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.