每个人都至少知道两个常见的c#习语,包括合并算子:
单身人士:return _staticField = _staticField ?? new SingletonConstructor();
和一个链条:
notNullableResult = nullable1 ?? nullable2 ?? nullable3 ?? default(someType);
它可读,一致,值得在代码中使用和识别。
但不幸的是,这就是全部。有时它需要扩展或改变。有时我会在看到特定情况时使用它们 - 而且我总是犹豫使用它,因为我不知道是否有其他程序员会真正阅读它。
你知道其他人吗?我希望有更具体的用法:例如Asp.net,EF,LINQ,任何东西 - 合并的地方不仅可以接受,而且非常引人注目。答案 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;
}