it-roy-ru.com

Обнуляемый bool как переменная с тремя состояниями в C #

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

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

17
Petrus Theron

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

15
Nick

Вы должны получить копию Framework Design Guidelines .

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

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

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

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

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

В C #, C++, Java или как угодно.

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

4
Matías Fidemraizer

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

bool? mytristatebool = null;
2
Sam Saarian

Нет

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

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

2
V4Vendetta

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

0
Gayan Dasanayake

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

0
Chalky

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

0
RenniePet

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

0
Pleun