Tristate значения - есть ли соглашение?

Меня бросили немного проблемку, и я не уверен, что ответ.

В основном - существует ли соглашение о том, какие значения использовать в трехсторонних типах данных? Занимаясь поиском, он не выглядит так: Я видел:

  • -1 = неверно, 0 = неизвестно / не определено, +1 = верно
  • 0 = неверно, +1 = верно, +2 = неизвестно / не определено
  • -1 = неизвестно / не определено, 0 = неверно, +1 = верно

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

редактировать
Нашел и этот, который Microsoft, похоже, использует в недавнем коде: -1 = true, 0 = false, 2 = неизвестно. Я предполагаю, что наличие 2 == unknown означает, что это устраняет неоднозначность по сравнению с интерпретацией +1/-1 при простом просмотре необработанных значений в отладчике / дампе / памяти и т. Д. Как ни странно, эта опция привлекательна только по этой причине (исключает возможность забывая, что вариант 1 означает "истинно").

4 ответа

Решение

Насколько мне известно, для этого нет соглашения.

Не существует даже единого соглашения для логического значения, наиболее распространенными являются:

  • 0 = неверно, -1 = верно
  • 0 = неверно, 1 = верно

Другим распространенным (но не универсальным) соглашением, которое было бы уместно, является использование -1 для неопределенных значений.

Если вы решите использовать -1 для неопределенного, вы можете использовать 0/1 для False / True:

  • -1 = не определено
  • 0 = Ложь
  • 1 = верно

И, естественно, я должен отметить, что третье состояние, конечно, должно быть не неопределенным / неизвестным, а FileNotFound.;)

Независимо от семантического значения, которое вы придаете, я бы выбрал ваши три значения как одно отрицательное число, одно положительное число и ноль. Это позволяет проводить оптимальное тестирование на членство в каждом возможном 1- или 2-элементном подмножестве из 3 возможных значений с помощью только одного теста и ветвления (>0, <0, ==0, >=0, <=0,!=0).

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

Value       State
----------  ----------
 -1         Undefined
  0         False
 +1         True

Я не предпочел бы первые два случая, потому что чистые логические состояния в основном определяются как 0 = False а также 0 <> True так что это может немного сбить с толку.

Если вы ищете замену для булева с тремя состояниями с помощью int, вы всегда можете получить логическое значение null, не беспокоясь о стандартах. Что-то вроде, в C# bool? triState, Он может иметь значения true, false или null, которые можно считать неизвестными, но я вижу, что это не то, что вы ищете.

Я не знаю о конвенции. Скорее всего, не из ответов, приведенных здесь. Мне нравится твой третий.

Но с другой точки зрения, мой выбор будет:

{ True, Unknown, False } => 0, 1, 2 // going by enum like values...

РЕДАКТИРОВАТЬ: После хорошей точки @LarsTech, я должен уточнить. Что если я знаю, что для переменной может быть больше двух значений, я бы подумал, что это перечисление, и, следовательно, я мог бы перевести ее в { 0, 1, 2 }. Я всегда следую шаблону значений enum, например: "Хорошо, хорошо, плохо". Это естественно для меня, но для многих истинных иметь "0" не приветствуется. Можно всегда иметь обратный порядок.

Другие вопросы по тегам