Реализация операторов между нулевыми и базовыми типами - стоит ли?

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

Это означает, что вы можете иметь структуру , которая может быть проверена на null , и вернуть true .

Теперь это было бы удобно в моей ситуации - по совету другого члена у меня есть структура, которая обертывает строки. Возможность напрямую сравнивать эту обернутую строку с нулем (а не использовать .IsNull или что-то в этом роде) для меня гораздо естественнее, а значит, переход от использования строк к этим оберточным строкам часто не требует никаких других изменений в коде.

Но... тот факт, что эта возможность (мне кажется) малоизвестна, не интуитивен для любого, кто думает о структуре (которой она является) над строкой (которую она представляет), и тот факт, что она путает ReSharper (structValue == null предупреждает "выражение всегда ложно"), заставляет меня думать, что это, возможно, грязный трюк, оставшийся в шкафу с грязными, но аккуратными трюками.

Так что мне интересно, вы бы усыновили его? Если нет, простите меня за это... или лучше не идти по этому пути?


public struct StringWrapper
{
    private readonly string str;
    public override string ToString() { return str; }

    public static bool operator ==(StringWrapper a, StringWrapper b) 
    { return a.str == b.str; }
    public static bool operator !=(StringWrapper a, StringWrapper b) 
    { return !(a == b); }
    public static bool operator ==(StringWrapper a, StringWrapper? b)
    {
        if (!b.HasValue || b.Value.str == null) return a.str == null;
        return a == (StringWrapper)b;
    }
    public static bool operator !=(StringWrapper a, StringWrapper? b) 
    { return !(a == b); }
    public static bool operator ==(StringWrapper? a, StringWrapper b) 
    { return b == a; }
    public static bool operator !=(StringWrapper? a, StringWrapper b) 
    { return !(a == b); }

    public StringWrapper(string str) { this.str = str; }
}

6
задан Community 23 May 2017 в 12:04
поделиться