常见的C#用法,包括合并运算符(??运算符)

7

每个人都知道至少有两个常用的c#语言习惯用法,其中之一是null 合并运算符:

第一个是单例模式:

return _staticField = _staticField ?? new SingletonConstructor();

还有一个链:

notNullableResult = nullable1 ?? nullable2 ?? nullable3 ?? default(someType);

它在代码中易读、一致、值得使用和易识别。但不幸的是,这就是全部。有时需要扩展或更改。有时我在看到特定情况时会使用它,但我总是犹豫是否其他程序员能够轻松阅读。您知道其他类似函数吗?我希望有更多具体用途,例如Asp.net、EF、LINQ等,在这些情况下,coalesce不仅仅是可接受的,而且是卓越的选择。


1
在我看来,空值合并运算符的所有用法都只是“链式一”这个特例。 - Anon.
尽管所有情况或多或少都是特殊或一般的,但对我来说,编程的艺术在于平衡和感受差异。Coalesce是“if”语句的一个特例,不是吗?而switch-case也是一个特例,那么要去除它们吗? - rudnev
1
这不是实现懒加载单例的正确方式。即使您在此问题中仅出于简洁而省略了lock块,它仍然只会使代码变得更加混乱。 - Aaronaught
我并不总是需要一个懒汉式单例:) 生活有时很悲哀。 - rudnev
你的意思是线程安全,而不是懒加载,对吗? - rudnev
你发布的单例代码显然是一个懒加载器;而且,缺乏线程安全确实是我所暗示的。 - Aaronaught
2个回答

6

对我来说,它本身转换成SQL就足够好了:

from a in DB.Table
select new {
             a.Id,
             Val = a.One ?? a.Two ??a.Three
           }

这导致数据库端的COALESCE在大多数情况下使SQL更加干净,没有更好的替代方案。我们正在使用Oracle,我不想看到Nvl(Nvl(Nvl(Nvl(嵌套谢谢...我会使用COALESCE并运行它。
我也将其用于像这样的属性,只是个人口味:
private string _str;
public string Str { 
  get { return _str ?? (_str = LoaderThingyMethod()); } 
}

4
C# 2.0引入null-coalescing运算符的原因是为了为可空类型分配默认值,从而轻松地将可空类型转换为非可空类型。没有使用 ?? 运算符,任何转换都需要冗长的 if 语句。以下引用来自MSDN:
可空类型可以包含一个值,也可以未定义。?? 运算符定义可返回的默认值,当将可空类型分配给非可空类型时。如果尝试将可空值类型分配给非可空值类型而不使用 ?? 运算符,则会生成编译时错误。如果使用强制转换,并且当前未定义可空值类型,则会抛出 InvalidOperationException 异常。
你可能认为以下简化“非常显著”:
int? x = null;
int y = x ?? -1;

取代

int? x = null;
int y = -1;

if (x.HasValue)
{
    y = x.Value;
}

是的,我应该指出链通常涉及到可空值。谢谢。 - rudnev
空值合并运算符实际上是在C# 2.0中引入的,而不是3.0(与可空类型相同)。 - Thomas Levesque

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接