В моем случае использования мне нужно обязательное логическое свойство, например:
public class Todo
{
[Required]
public bool IsDone {get; set; }
}
Я столкнулся с ошибкой в моем проекте Entity Framework из-за отсутствия сопоставления свойства (значение не было установлено) логического свойства. В результате я всегда сохранял логическое значение по умолчанию 'false, в то время как оно на самом деле не заполнено. Когда оно не заполнено, я ожидаю выдать исключение проверки, но поскольку его примитивный тип, атрибут проверки не имеет смысла, поскольку он всегда имеет значение по умолчанию, которое достаточно, чтобы пройти. Я не хочу иметь значение по умолчанию, и атрибут validation должен выдавать исключение, когда значение не установлено.
Решение, которое я придумала, состоит в том, чтобы использовать обнуляемые логические значения с обязательным атрибутом. Если свойство не задано, обязательный атрибут выдаст исключение, что здорово. С другой стороны, довольно странно иметь обязательный логический тип, допускающий значение NULL, потому что вы знаете, что он всегда заполнен (из-за обязательного атрибута), и это делает бизнес-логику об этом свойстве менее читаемой (IsDone.HasValue? IsDone.Value: false;/Не должно быть возможно, потому что это требуется /).
Возможны ли другие решения?
Здесь есть несколько вариантов. То, что вы хотите, это механизм тройного состояния: не установлено, истина, ложь
Nullable bool действительно обеспечивает это, однако главный вопрос заключается в том, понятно ли это потребителям.
Второй вариант - создать тройное перечисление состояний и использовать его вместо этого.
Между этими двумя я бы сам пошел с обнуляемым булом. В конце концов, вы можете выбрать свой тип ситуации.
IsDone == true
иIsDone == false
довольно читабельны.