Обнуляемый bool как переменная с тремя состояниями в C # - PullRequest
20 голосов
/ 16 марта 2011

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

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

Ответы [ 9 ]

16 голосов
/ 16 марта 2011

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

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

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

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

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

4 голосов
/ 16 марта 2011

Я полагаю, что это будет ошибкой.

Логическое значение типа "два состояния".Это его определение.

В C #, C ++, Java и т. Д.

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

3 голосов
/ 16 марта 2011
нет

Нет

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

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

2 голосов
/ 31 марта 2014

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

bool? mytristatebool = null;
1 голос
/ 19 марта 2014

Если это программа WinForms, то одной из возможностей будет использование System.Windows.Forms.CheckState.У него есть значения Checked, Indeterminate и Unchecked - которые могут соответствовать или не соответствовать вашим целям.

1 голос
/ 07 февраля 2013

Более простой обходной путь - иметь две логические переменные. Один будет держать ноль / не-ноль а другой останется истинным / ложным

Приложение из этого:

Когда вы кэшируете вычисление в логическом свойстве, вам нужно знать, было ли оно уже установлено или нет.

, например

// 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 обращаются много раз.

0 голосов
/ 30 августа 2016

Это зависит. Отлично подходит для такой собственности, как «Has Dog»: Правда, Ложь, или мы просто не знаем.

0 голосов
/ 16 марта 2011

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

...