Ответ 1
Это немного субъективный вопрос, но я бы сказал нет, потому что это повлияло бы на читаемость.
Есть ли какая-либо заслуга в использовании nullable bool для хранения значения tri-state? Например, null == 1st state, false == 2nd state, true == 3rd state
?
Накладные расходы, вероятно, выше, чем использование байтового перечисления, но мне любопытно.
Это немного субъективный вопрос, но я бы сказал нет, потому что это повлияло бы на читаемость.
Вы должны получить копию Руководства по дизайну каркаса.
На странице 177 приведена глава Выбор между Enum и Boolean Parameters.
Один из пунктов:
Я считаю, что это сделало бы ошибку.
Логическое - это тип "двух состояний". Это его определение.
В С#, С++, Java или что-то еще.
Если вы хотите имитировать три состояния, просто выполните перечисление вместо того, чтобы изобретать квадратное колесо!
Нет
Я бы порекомендовал перейти на Enum, поскольку у вас уже есть 3 состояния в руке и с ползучести области действия он может еще больше увеличиться. Таким образом, Enum будет безопасной ставкой и более точной/удобочитаемой для описания трех состояний и, самое главное, третьего состояния, которое не является ни истинным, ни ложным.
В конце концов, это больше похоже на кодирование глаз, которые будут смотреть на этот код и сделать его значимым и читаемым для них.
использовать '?' mark в конце типа bool, который представляет собой структуру, содержащую nullable bool.
BOOL? mytristatebool = null;
Я бы придерживался null для неизвестных или еще не определил. Также вы теряете возможность делать математику по значениям. В целом неплохая идея. Думаю,
Простейшим обходным решением является наличие двух булевых переменных. Один будет содержать null/not-null а другой сохранит true/false
Применение этого:
Когда вы кешируете вычисление в логическом свойстве, вам нужно знать, было ли оно уже установлено или нет.
например.
// actual variable having true/false
private bool isX = false;
// variable holding wither above is set/not-set i.e. null/not-null
private bool isXSet = false;
public bool IsX
{
get
{
if (isXSet)
{
return isX;
}
else
{
isX = GetX(); // this could be time consuming.
isXSet = true;
return isX;
}
}
}
Это становится полезным при настройке производительности, когда GetX() выше занимает много времени, а IsX доступен много раз.
Если это программа WinForms, то одна из возможностей - использовать System.Windows.Forms.CheckState. Он имеет значения "Проверено", "Неопределенный" и "Непроверенный", который может или не подходит для ваших целей.
Это зависит. Отлично подходит для такого свойства, как "Has Dog": True, False, или мы просто не знаем.