Что такое логическое значение по умолчанию в C #?

82

Boolean ( 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???

JohnJohnGa
источник
1
Вы можете найти blogs.msdn.com/b/ericlippert/archive/2009/10/12/… интересный
AakashM

Ответы:

101

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

Помните, что использование неинициализированных переменных в C # запрещено.

С участием

bool foo = new bool();

foo будет иметь значение по умолчанию.

Логическое значение по умолчанию - false

Деструктор
источник
1
Извините, добавлено: помните, что использование неинициализированных переменных в C # запрещено. Как видно из связанной статьи
Деструктор
1
Благодаря! и так, как вы можете объяснить мой "Edit 2" :)
JohnJohnGa
1
значение по умолчанию будет установлено, если вызывается конструктор по умолчанию. Вы только что инициализировали новую переменную значением. "int i" выдаст ту же ошибку -Использование неназначенной локальной переменной-. Установите значение при инициализации или вызовите конструктор по умолчанию. так что проблем у вас не будет :)
Destructor
1
@Destructor Я думаю, что ваш комментарий немного сбивает с толку. Причина, по которой resharper предполагает, что OP не нужно инициализировать логическое поле, заключается в том, что полям в классе автоматически присваивается значение по умолчанию, а локальные переменные - нет. См. Ответ Хасана ниже.
Alex
26

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

Только следующие переменные автоматически инициализируются значениями по умолчанию:

  • Статические переменные
  • Переменные экземпляра экземпляров класса и структуры
  • Элементы массива

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

  • Значение по умолчанию для переменной ссылочного типа - null.
  • Для целочисленных типов значение по умолчанию - 0
  • Для char значение по умолчанию - `\ u0000 '
  • Для float значение по умолчанию - 0,0f.
  • Для double значение по умолчанию - 0,0d.
  • Для десятичного числа значение по умолчанию - 0,0 м.
  • Для bool значение по умолчанию - false
  • Для типа перечисления значение по умолчанию - 0
  • Для типа структуры значение по умолчанию получается путем установки всех полей типа значения в их значения по умолчанию.

Что касается более поздних частей вашего вопроса:

  • Причина, по которой все переменные, которые не инициализируются автоматически значениями по умолчанию, должны быть инициализированы, - это ограничение, наложенное компилятором.
  • частный bool foo = false; Это действительно избыточно, поскольку это переменная экземпляра класса. Следовательно, в конструкторе по умолчанию для этого будет установлено значение false. Следовательно, нет необходимости устанавливать это значение false.
Хасан Фахим
источник
4
Для полноты картины в таблице значений по умолчанию в MSDN указано, что значения по умолчанию для типов структур также включают установку «всех полей ссылочного типа равными нулю».
Карл Уолш,
10

Значение по умолчанию действительно ложно.

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

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

bool foo = default(bool);
if (!foo) { Console.WriteLine("Default is false"); }
Петар Иванов
источник
4

Значение по умолчанию для bool - false. См. Эту таблицу для получения подробной информации о значениях по умолчанию. Единственная причина, по которой он не будет ложным при проверке, - это если вы инициализируете / установите его в значение true.

Кори Ларсон
источник
0

Попробуйте это (используя ключевое слово по умолчанию)

 bool foo = default(bool); if (foo) { } 
ТалантТюнер
источник
0

Это можно рассматривать как подход к защитному программированию со стороны компилятора - переменные должны быть присвоены, прежде чем его можно будет использовать.

Аджай
источник