常见的c#成语包括合并?操作者

时间:2010-02-24 23:14:10

标签: c# null-coalescing-operator

每个人都至少知道两个常见的c#习语,包括合并算子:

单身人士:

return _staticField = _staticField ?? new SingletonConstructor();

和一个链条:

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

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

但不幸的是,这就是全部。有时它需要扩展或改变。有时我会在看到特定情况时使用它们 - 而且我总是犹豫使用它,因为我不知道是否有其他程序员会真正阅读它。

你知道其他人吗?我希望有更具体的用法:例如Asp.net,EF,LINQ,任何东西 - 合并的地方不仅可以接受,而且非常引人注目。

2 个答案:

答案 0 :(得分: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()); } 
}

答案 1 :(得分:4)

在C#2.0中引入了空合并运算符的原因是有一种方法可以将默认值赋给nullable types,从而可以轻松地将可空类型转换为非可空类型。如果没有??任何转换,则需要冗长的if语句。以下引用取自MSDN

  

可空类型可以包含值,   或者它可以是未定义的。 ?? ??   运算符将默认值定义为   当可以为空的类型时返回   分配给非可空类型。如果   您尝试分配可以为空的值   键入不可为空的值类型   不使用??接线员,你   将生成编译时错误。如果   你使用强制转换和可以为空的值   类型目前尚未定义,a   InvalidOperationException异常   将被抛出。

您可能会认为以下简化“非凡”:

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

而不是

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

if (x.HasValue)
{
    y = x.Value;
}
相关问题