Я видел метод return bool?
, знает ли кто-нибудь его значение?
Что делает bool? средний тип возврата?
Ответ 1
T?
- это ярлык синтаксиса С# для Nullable<T>
. Итак, bool?
отображается в Nullable<bool>
. Таким образом, в вашем случае это структура, которая либо null
, либо имеет значение bool
.
Если a Nullable<T>
- null
, то бит отличается от ссылочного типа нулевым. В основном это структура, содержащая базовый тип и логический флаг HasValue
. Но и среда выполнения, и язык С# имеют немного магии, чтобы притворяться, что Nullable
с HasValue==false
действительно является нулевым. Но разница по-прежнему протекает иногда.
Основной тип неявно конвертируется в тип с нулевым значением (bool
→ bool?
). Чтобы получить базовый тип из типа с нулевым значением, вы можете либо явно указать ((bool)myNullableBool
, либо использовать свойство Value
(myNullableBool.Value
). Перед этим нужно проверить null
, или вы получите исключение, если значение nullable равно null
.
Ответ 2
В С# "примитивные" типы не могут содержать нулевое значение:
int blah = null;
Это сделает исключение, потому что 'int' не может содержать нулевое значение.
То же самое с double, float, bool, DateTime...
Это хорошо. Проблема возникает, когда вы используете базы данных. В базе данных вы можете иметь строки, которые могут быть нулевыми, например Age (это int).
Как вы держите эту строку на объекте? Ваш int не может содержать нулевое значение, и строка может иметь значение null.
По этой причине MS создала новую структуру, Nullable, вы можете передать этой структуре "примитивный" тип (или структуру), чтобы сделать его нулевым, например:
Nullable<int> blah = null;
Это не сделает исключение, теперь эта переменная может содержать int и null.
Поскольку Nullable слишком длинный, MS создала какой-то псевдоним: если вы положили '?' после типа он становится нулевым:
int? blah = null;
Nullable<int> blah = null;
Эти две строки ТОЧНО одинаковы, но первая легче читать.
Что-то вроде этого:)
Ответ 3
Любой (no-nonsense 1) тип значения, суффикс с ?
, делает его типом с нулевым значением:
-
int?
- целое число с нулевым значением -
bool?
имеет значение nullable boolean, которое на самом деле является triple state boolean (true
,false
иnull
) - подумайте об этом, когда вам нужно реализовать какое-то поведение в тройном состоянии. - ...
Другими словами, тип object
не поддерживает определение с нулевым значением как object?
, потому что он ссылочный тип и может иметь значение null
уже.
Использование в режиме реального времени
Ненасыщенные типы чаще всего используются в отношении базы данных, потому что они действительно упрощают преобразование nullable int/bit/datetime/etc. столбцы для типов CLR. Как в этом примере:
create table Test
(
Id int identity not null primary key,
Days int null,
ExactDate datetime null,
Selected bit null
)
Это можно легко перевести в POCO:
public class Test
{
public int Id { get; set; }
public int? Days { get; set; }
public DateTime? ExactDate { get; set; }
public bool? Selected { get; set; }
}
1 no-nonsense относится ко всем типам значений, кроме
Nullable<T>
, который является типом значения как таковым, но не имеет смысла делать его допустимым еще раз... Избегайте такой глупости... Это не скомпилируется, потому чтоNullable<Nullable<int>> i = null;
можно интерпретировать двумя способами:•
i.HasValue == false
•i.HasValue == true && i.Value.HasValue == false