Сколько переопределений вам действительно нужно в структуре в C #? - PullRequest
0 голосов
/ 07 июля 2011

Я создаю оболочку для слова в проекте эмулятора. Это означало, что все мои конверсии в одном месте. Я как раз собирался начать реализовывать все переопределения для математических функций (+, -, /, 8, shift и т. Д.) Когда мне пришло в голову, что не все неявные позаботятся об этом? Нужно ли переедать> = и <= когда я получил> <и ==? </p>

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

public struct word_t
{
    ulong val;
    word_t(ulong val) { this.val = val; }
    public static implicit operator word_t(int a) { return new word_t((ulong)a); }
    public static implicit operator word_t(long a) { return new word_t((ulong)a); }
    public static implicit operator word_t(uint a) { return new word_t((ulong)a); }
    public static implicit operator word_t(ulong a) { return new word_t((ulong)a); }
    public static implicit operator int(word_t a) { return (int)a.val; }
    public static implicit operator long(word_t a) { return (long)a.val; }
    public static implicit operator uint(word_t a) { return (uint)a.val; }
    public static implicit operator ulong(word_t a) { return (ulong)a.val; }
    public static bool operator ==(word_t a, word_t b) { return a.val == b.val; }
    public static bool operator !=(word_t a, word_t b) { return a.val != b.val; }
    public static bool operator >(word_t a, word_t b) { return a.val > b.val; }
    public static bool operator <(word_t a, word_t b) { return a.val < b.val; }
    public override bool Equals(object obj) {
            return obj.Equals(val);
    }
    public override int GetHashCode() {
        return val.GetHashCode();
    }
    public override string toString() {
        return val.ToString();
    }
}

Моя интуиция говорит мне «доверять компилятору», но моя голова всегда беспокоится о том, насколько он эффективен.

PS Я только что понял, что должен переопределить сдвиги из-за сдвига битов проблем с отрицательными числами, но сейчас представьте, что сдвиги просто волшебным образом работают, как сложения между uint и int.

1 Ответ

1 голос
/ 07 июля 2011

Я рекомендую эту статью MSDN: http://msdn.microsoft.com/en-us/library/8edha89s(v=VS.100).aspx

Показывает операторов, которых вы можете перегрузить, и любые уловы. Вы можете перегружать <= и >=, но они должны быть перегружены попарно, как это верно и для == и !=.

Операторы комплексного соответствия + = и т. Д. Доступны, если + и т. Д. Перегружены и т. Д.

>= и <=, однако, являются отдельными. То есть перегрузка > и == не дает вам неявно оператора >=.

...