Какая польза от типа Nullable <bool>? - PullRequest
11 голосов
/ 05 февраля 2010
Переменная

a bool может содержать значение true или false, в то время как bool? также может быть нулевой.

Зачем нам нужно третье значение для bool? Если это не истина , что бы это ни было, это == ложь

Можете ли вы предложить сценарий, в котором я хотел бы представить bool? .

Спасибо

Ответы [ 15 ]

1 голос
/ 05 февраля 2010

может иметь значение nullable, что может означать, что bool не был установлен или инициализирован, если это то, что вашей программе может понадобиться знать

0 голосов
/ 05 февраля 2010

Я думаю, что основной мотивацией (по крайней мере, так было представлено так :-)) для добавления в C # 2 обнуляемых типов были базы данных. В базе данных любой тип данных может иметь значение NULL, и при сопоставлении их с C # это является проблемой. Обнуляемые типы позволяют справиться с этим довольно элегантно - вы можете использовать int?, bool? и другие. Они используются, например, в LINQ to SQL.

Что означает третье значение для логических значений, это, конечно, зависит от приложения. Я предполагаю, что обычно это будет означать, что значение / поле недоступно.

0 голосов
/ 05 февраля 2010

Вот еще один вариант использования. Подумайте об иерархической структуре данных, которая имеет логическое свойство. Установка такого свойства для родителя будет применяться ко всем его дочерним элементам, если они не установлены явно. Разрешения «Только чтение» для файлов и папок в Windows (которые имеют флажок с тремя состояниями).

Parent1(readonly: true, evaluates true)
  |-Parent2(readonly: null, evaluates true)
    |-Child1(readonly: false, evaluates false)
    |-Child2(readonly: null, evaluates true)
 |-Parent3(readonly: false, evaluates false)
    |-Child1(readonly: false, evaluates false)
    |-Child2(readonly: null, evaluates false)
0 голосов
/ 05 февраля 2010

Допустим, заказ был размещен, но еще не отправлен. Какое значение Order.ShippedDate?

Старомодным способом справиться с этим было использование магического значения, например DateTime.MinValue. Существовали и другие способы решения этой проблемы (например, тип оболочки или дополнительный флаг bool, указывающий, что заказ еще не отправлен). Ни один из них не является очень удовлетворительным. Необходим единый способ решения проблемы отсутствующего или неизвестного значения.

Таким образом, современный подход состоит в том, чтобы позволить Order.ShippedDate принимать значение, которое семантически фиксирует, что заказ еще не отправлен. Эту роль играют обнуляемые типы. Семантически вы должны думать о том, что экземпляр Nullable<T> с HasValue является false как представляющий «отсутствующий» или «неизвестный».

Кроме того, в базах данных уже давно разрешено использование столбца null. Например, у вас может быть столбец с целочисленными значениями, который допускает нулевое значение. Как вы взаимодействуете с таким столбцом из кода, если вы не разрешаете обнулять int s? Опять же, вы могли бы использовать упомянутые выше подходы, но гораздо приятнее, когда в языке есть встроенная возможность семантической фиксации ситуации, которую мы пытаемся смоделировать.

0 голосов
/ 05 февраля 2010

Вы хотели бы использовать это, чтобы охватить ситуацию «что если пользователь не указывает ни true, ни false?»

Это просто способ охватить все возможные результаты.

...