Это может быть хорошо известно и обсуждаться, но, к моему удивлению, сегодня я обнаружил, что вы можете дать свою собственную реализацию операторов между нулевыми и их базовыми типами.
Это означает, что вы можете иметь структуру
, которая может быть проверена на 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; }
}