Реализация Tribool в C # - PullRequest
       3

Реализация Tribool в C #

3 голосов
/ 01 февраля 2010

Я пытаюсь реализовать тип Tribool, используя http://www.boost.org/doc/libs/1_41_0/doc/html/tribool.html в качестве ссылки.

Я использую структуру, поскольку она является примитивным типом и не должна расширяться. Я знаю, что существует три типа трибунов - True, False и Unknown, и конструктор по умолчанию должен предоставлять False Tribool. У меня вопрос, какой тип данных я устанавливаю True, False и Unknown? Прямо сейчас у меня есть:

struct Tribool
{
    //True, False, and Unknown public constants
    public static readonly Tribool TRUE, FALSE, UNKNOWN;

    //Constructors
    public Tribool()
    {
        Tribool = FALSE; //use ValueType instead?
    }

но я не уверен, что это правильно, поскольку похоже, что я просто устанавливаю Tribool на другой Tribool. Должен ли я использовать ValueType вместо этого? Оно появилось, когда я печатал в VS, и звучит разумно, но я не смог найти много информации об этом от Google.

Кроме того, Tribool должен быть в состоянии работать с обычными bools, что означает, что «true» и «false» должны быть перегружены. Требует ли это перегрузки оператора? Или это просто метод, который возвращает bool?

Заранее спасибо!

Редактировать: Извините, я должен был упомянуть, что это было для назначения. Так что я не могу использовать bools, хотя это гораздо практичнее, как отмечали многие из вас.

Ответы [ 3 ]

7 голосов
/ 01 февраля 2010
bool?

сделано. Что делать? В частности, компилятор C # предоставит вам «поднятые» операторы для сопоставления с bool. Возможно, однако, это может быть немного больше , чем просто bool или одно перечисление.

Примечание: не используйте ValueType, так как на самом деле это будет операция с боксом.

Если бы вы не могли использовать bool? (т.е. вы хотели реализовать с нуля), я бы отобразил его на enum ( возможно a byte enum, но я бы по умолчанию int как обычно):

public struct Tribool : IEquatable<Tribool> {
    public static Tribool True { get { return new Tribool(true); } }
    public static Tribool False { get { return new Tribool(false); } }
    public static Tribool Unknown { get { return new Tribool(); } }
    enum TriboolState { Unknown = 0, True = 1, False = 2 }

    private readonly TriboolState state;
    public Tribool(bool state) {
        this.state = state ? TriboolState.True : TriboolState.False;
    }
    // default struct ctor handles unknown
    public static bool operator true(Tribool value) {
        return value.state == TriboolState.True;
    }
    public static bool operator false(Tribool value) {
        return value.state == TriboolState.False;
    }
    public static bool operator ==(Tribool x, Tribool y) {
        return x.state == y.state;
    }
    public static bool operator !=(Tribool x, Tribool y) {
        return x.state != y.state; // note: which "unknown" logic do you want?
                                   // i.e. does unknown == unknown?
    }
    public override string ToString() {
        return state.ToString();
    }
    public override bool Equals(object obj) {
        return (obj != null && obj is Tribool) ? Equals((Tribool)obj) : false;
    }
    public bool Equals(Tribool value) {
        return value == this;
    }
    public override int GetHashCode() {
        return state.GetHashCode();
    }
    public static implicit operator Tribool(bool value) {
        return new Tribool(value);
    }
    public static explicit operator bool(Tribool value) {
        switch (value.state) {
            case TriboolState.True: return true;
            case TriboolState.False: return false;
            default: throw new InvalidCastException();
        }
    }
}
7 голосов
/ 01 февраля 2010

Почему бы просто не использовать bool?, который является логическим значением Nullable?

2 голосов
/ 01 февраля 2010

Что не так с Nullable<bool>?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...