7

每个人都知道至少两个常见的 C# 习惯用法,包括合并运算符:

单身人士:

return _staticField = _staticField ?? new SingletonConstructor();

和一个链:

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

它在代码中可读、一致、值得使用和可识别。

但是,不幸的是,仅此而已。有时它需要扩展或改变。有时我会在看到特定案例时使用它们——而且我总是犹豫使用它,因为我不知道是否有任何其他程序员会真正轻松地阅读它。

你认识其他人吗?我希望有更具体的用法:例如 Asp.net、EF、LINQ,任何东西——其中的合并不仅是可以接受的,而且是显着的。

4

2 回答 2

6

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

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

在大多数情况下,这导致COALSCE数据库方面的SQL非常干净,没有任何好的选择。我们正在使用 Oracle,虽然嵌套,但我宁愿不阅读Nvl(Nvl(Nvl(Nvl(谢谢...我会带着COALSCE它运行。

我也将它用于这样的属性,我猜只是个人口味:

private string _str;
public string Str { 
  get { return _str ?? (_str = LoaderThingyMethod()); } 
}
于 2010-02-24T23:20:17.937 回答
4

在 C# 2.0 中引入空值合并运算符的原因是有一种方法可以将默认值分配给可空类型,从而轻松地将可空类型转换为不可空类型。没有??任何转换将需要冗长的if陈述。以下引用来自MSDN

可空类型可以包含一个值,也可以是未定义的。这 ??运算符定义将可空类型分配给不可空类型时要返回的默认值。如果您尝试将可空值类型分配给不可空值类型而不使用 ?? 运算符,您将生成编译时错误。如果您使用强制转换,并且当前未定义可空值类型,则会引发 InvalidOperationException 异常。

您可能会认为以下简化“了不起”:

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

代替

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

if (x.HasValue)
{
    y = x.Value;
}
于 2010-02-24T23:36:30.667 回答