Подтвердить что ты не робот

Nullable bool как переменная tri-state в С#

Есть ли какая-либо заслуга в использовании nullable bool для хранения значения tri-state? Например, null == 1st state, false == 2nd state, true == 3rd state?

Накладные расходы, вероятно, выше, чем использование байтового перечисления, но мне любопытно.

4b9b3361

Ответ 1

Это немного субъективный вопрос, но я бы сказал нет, потому что это повлияло бы на читаемость.

Ответ 2

Вы должны получить копию Руководства по дизайну каркаса.

На странице 177 приведена глава Выбор между Enum и Boolean Parameters.

Один из пунктов:

  • НЕ используйте Booleans, если вы не уверены, что никогда не будет необходимости в более чем двух значениях.

Ответ 3

Я считаю, что это сделало бы ошибку.

Логическое - это тип "двух состояний". Это его определение.

В С#, С++, Java или что-то еще.

Если вы хотите имитировать три состояния, просто выполните перечисление вместо того, чтобы изобретать квадратное колесо!

Ответ 4

Нет

Я бы порекомендовал перейти на Enum, поскольку у вас уже есть 3 состояния в руке и с ползучести области действия он может еще больше увеличиться. Таким образом, Enum будет безопасной ставкой и более точной/удобочитаемой для описания трех состояний и, самое главное, третьего состояния, которое не является ни истинным, ни ложным.

В конце концов, это больше похоже на кодирование глаз, которые будут смотреть на этот код и сделать его значимым и читаемым для них.

Ответ 5

использовать '?' mark в конце типа bool, который представляет собой структуру, содержащую nullable bool.

BOOL? mytristatebool = null;

Ответ 6

Я бы придерживался null для неизвестных или еще не определил. Также вы теряете возможность делать математику по значениям. В целом неплохая идея. Думаю,

Ответ 7

Простейшим обходным решением является наличие двух булевых переменных. Один будет содержать 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 доступен много раз.

Ответ 8

Если это программа WinForms, то одна из возможностей - использовать System.Windows.Forms.CheckState. Он имеет значения "Проверено", "Неопределенный" и "Непроверенный", который может или не подходит для ваших целей.

Ответ 9

Это зависит. Отлично подходит для такого свойства, как "Has Dog": True, False, или мы просто не знаем.