c# - 在可空值和基类型之间实现运算符——我应该这样做吗?

标签 c# operator-overloading nullable

这可能广为人知并受到讨论,但令我惊讶的是,我今天发现您可以在可空值及其基类型之间提供您自己的运算符实现。

这意味着您可以拥有一个struct,它可以检查null,并返回true

现在这在我的情况下会很方便 - 根据 another member 的建议我有一个包装字符串的结构。能够直接将这个包装的字符串直接与 null 进行比较(而不是使用 .IsNull 或类似的)对我来说更自然,并且意味着从使用字符串更改为这些 WrappedStrings 通常不需要对代码进行其他更改。

但是..这个特性(我相信)鲜为人知,对于任何认为结构(它是)而不是字符串(它代表的)的人来说是违反直觉的,而且它混淆了 ReSharper( structValue == null 警告“expression is always false”)让我觉得这可能是留在肮脏但整洁的技巧柜子里的一个肮脏的技巧。

所以我想知道,你会采用它吗?如果不是,您会原谅我这样做吗……还是最好不要走这条路?


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; }
}

最佳答案

我坚信代码是自文档化的,并且与 principle of least astonishment 一致.例如,“getter”不应该修改数据等。我会考虑将 struct 变量与 null 进行比较,乍一看相当困惑,所以我会避免它(无论它看起来多么方便)。如果您期望很多人使用(或至少查看)您的代码,则尤其如此。

关于c# - 在可空值和基类型之间实现运算符——我应该这样做吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7426659/

相关文章:

c# - 连接未打开

c# - 代码不断吃内存

c# - 在 Richtextbox 中查找和遍历表格

c++ - 如何为两个已经存在的类型创建重载?

c++ - 为什么 test2 + test3 的运算符 << 不能重载?

c# - 当 url 末尾有 DOT (.) 时,Asp.Net MVC 路由操作方法不会调用

c++ - SFINAE 不能防止不明确的运算符重载吗?

.net - 何时在 F# 中引发 nullArg

c# - 如何使 C# 类的 Object 属性可选?

scala - 标记方法调用它总是返回非空结果