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