Подтвердить что ты не робот

Какая разница между "bool" и "bool?"?

Я использую тип "bool" для переменных, как я использовал в С++, и я пытаюсь поместить значения функций или свойств, которые, как я полагаю, будет логическим в моей переменной. Однако часто встречаются случаи, когда тип результата - "bool?" а не "bool", и неявное кастинг заканчивается.

В чем разница между двумя и когда каждый используется? Кроме того, следует ли использовать "bool?"? как тип моей переменной? Это лучшая практика?

4b9b3361

Ответ 1

Символ ? после типа - это только ярлык Nullable type, bool? эквивалентен Nullable<bool>.

bool является значением типа, это означает, что он не может быть null, поэтому тип Nullable в принципе позволяет вам обернуть значение типы и возможность присваивать им null.

bool? может содержать три разных значения: true, false и null.

Кроме того, нет операторов короткого замыкания (& ||), определенных для bool?

Определены только логические операторы AND, включительно OR, и они ведут себя следующим образом:

x        y      x & y   x | y   
true    true    true    true
true    false   false   true
true    null    null    true
false   true    false   true
false   false   false   false
false   null    false   null
null    true    null    true
null    false   false   null
null    null    null    null

Тип Nullable - это, в основном, общая структура, которая имеет следующие общедоступные свойства:

public struct Nullable<T> where T: struct
{
    public bool HasValue { get; }
    public T Value { get; }
}

Свойство HasValue указывает, имеет ли текущий объект значение, а свойство Value получит текущее значение объекта, или если HasValue является ложным, оно выдает исключение InvalidOperationException.

Теперь вам нужно что-то задавать, Nullable - это структура, тип значения, который не может быть нулевым, поэтому почему справедлив следующий оператор?

int? a = null;

Этот пример будет скомпилирован в следующее:

.locals init (valuetype [mscorlib]System.Nullable`1<int32> V_0)
IL_0000:  ldloca.s   V_0
IL_0002:  initobj    valuetype [mscorlib]System.Nullable`1<int32>

Вызов initobj, который инициализирует каждое поле типа значения по указанному адресу нулевой ссылке или 0 из подходящий примитивный тип.

Что это, то, что происходит здесь, является инициализацией структуры .

int? a = null;

Является эквивалентным:

Nullable<int> a = new Nullable<int>();

Ответ 2

bool? является нулевым, тогда как bool не является.

bool? first;
bool second;

В приведенном выше коде first будет null, а second будет false.

Одно типичное использование - если вы хотите узнать, было ли присвоение переменной. Поскольку bool - тип значения (как int, long, double, DateTime и некоторые другие типы), он всегда будет инициализирован значением по умолчанию (false в случае bool, 0 в случае a int). Это означает, что вы не можете легко узнать, является ли это false, потому что для него определен код false, или если он false, потому что он еще не назначен. В этом случае bool? пригодится.

Ответ 3

Всякий раз, когда вы видите? символ после имени типа, это сокращение для Nullable<TypeName>. Nullable - это особый тип, который позволяет типам значений действовать как нулевое значение. Это способ явно выражать тип значения может иметь значение без значения.

Для bool он фактически превращает переменную в значение tri-state

  • Со значением: True
  • Со значением: False
  • Без значения

Ответ 4

Добавление ? делает тип нулевым. Это означает, что вы можете это сделать:

bool? x = null;

И все будет в порядке.

Ответ 5

BOOL? означает, что значение boolean является нулевым и является синтаксическим сахаром для структуры Nullable<bool>. Поскольку логическое значение является типом значений, вы не можете установить его в значение null, но есть случаи, когда вы захотите использовать класс доступа к данным, поскольку поля базы данных могут иметь нулевые значения.

Ответ 6

bool может содержать только значения true и false, а bool? также может иметь значение null.

Ответ 7

Еще одно хорошее место для использования bool? находится в методе добавления нулевой проверки

public bool? IsTurkeyStillInFridge(Turkey turkey)
{
  if (turkey == null)
     return null;
  else if (fridge.Contains(turkey))
     return true;
  else
     return false;
}

bool? canStayAtDesk = IsTurkeyStillInFridge(turkey);

if (canStayAtDesk == null)
    MessageBox.Show("No turkey this year, check for ham.");
else if (canStayAtDesk == true)
    MessageBox.Show("Turkey for lunch. Stay at desk.");
else
    MessageBox.Show("Turkey gone, go out to lunch.");

Ответ 8

bool означает, что вы можете иметь значения true и false. BOOL? означает, что вы можете иметь значение true, false и null.

Он работает для datetime и booleans.