Что такое логическое значение по умолчанию в 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???


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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.