Какая разница между "bool" и "bool?"?
Я использую тип "bool" для переменных, как я использовал в С++, и я пытаюсь поместить значения функций или свойств, которые, как я полагаю, будет логическим в моей переменной. Однако часто встречаются случаи, когда тип результата - "bool?" а не "bool", и неявное кастинг заканчивается.
В чем разница между двумя и когда каждый используется? Кроме того, следует ли использовать "bool?"? как тип моей переменной? Это лучшая практика?
Ответы
Ответ 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.