使用空合并操作符的独特方法

我知道在C#中使用空合并运算符的标准方式是设置默认值。

string nobody = null;
string somebody = "Bob Saget";
string anybody = "";

anybody = nobody   ?? "Mr. T"; // returns Mr. T
anybody = somebody ?? "Mr. T"; // returns "Bob Saget"

但还有什么可以?? 用于? 它看起来并不像三元操作符那么有用,除了更简洁易读之外,还不如:

nobody = null;
anybody = nobody == null ? "Bob Saget" : nobody; // returns Bob Saget

所以,即使知道更少的空合并操作符......

  • 你用过?? 为了别的吗?

  • ?? 必要的,或者你应该只使用三元运算符(大多数人都熟悉)


  • 那么,首先,比标准三元链更容易链接:

    string anybody = parm1 ?? localDefault ?? globalDefault;
    

    string anyboby = (parm1 != null) ? parm1 
                   : ((localDefault != null) ? localDefault 
                   : globalDefault);
    

    如果null可能的对象不是变量,它也可以很好地工作:

    string anybody = Parameters["Name"] 
                  ?? Settings["Name"] 
                  ?? GlobalSetting["Name"];
    

    string anybody = (Parameters["Name"] != null ? Parameters["Name"] 
                     : (Settings["Name"] != null) ? Settings["Name"]
                     :  GlobalSetting["Name"];
    

    我用它作为懒惰加载一行:

    public MyClass LazyProp
    {
        get { return lazyField ?? (lazyField = new MyClass()); }
    }
    

    可读? 自己决定。


    我发现它有两个“有点奇怪”的用法:

  • 作为写入TryParse例程时使用out参数的替代方法(即,解析失败时返回空值)
  • 作为比较的“不知道”代表
  • 后者需要更多的信息。 通常,当您创建一个包含多个元素的比较时,您需要查看比较的第一部分(例如年龄)是否给出明确的答案,然后是仅当第一部分没有帮助时才接下来的部分(例如姓名)。 使用空合并运算符意味着你可以编写非常简单的比较(无论是排序还是相等)。 例如,在MiscUtil中使用几个辅助类:

    public int Compare(Person p1, Person p2)
    {
        return PartialComparer.Compare(p1.Age, p2.Age)
            ?? PartialComparer.Compare(p1.Name, p2.Name)
            ?? PartialComparer.Compare(p1.Salary, p2.Salary)
            ?? 0;
    }
    

    无可否认,我现在在MiscUtil中有了ProjectionComparer,以及一些扩展,这使得这种事情更容易 - 但它仍然很整洁。

    在实现Equals之前,检查引用相等(或无效)也是可以做到的。

    链接地址: http://www.djcxy.com/p/57969.html

    上一篇: Unique ways to use the Null Coalescing operator

    下一篇: Maybe coalescing operator