【问题标题】:Common c# idioms including coalesce ?? operator常见的 c# 习语,包括 coalesce ??操作员
【发布时间】:2011-01-20 18:51:39
【问题描述】:

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

单身人士:

return _staticField = _staticField ?? new SingletonConstructor();

还有一个链条:

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

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

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

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

【问题讨论】:

  • 在我看来,null 合并运算符的所有使用都只是您的“链一”的特例。
  • 不过,所有的情况或多或少都是特殊的或一般的。对我来说,编程的艺术就是平衡和感受不同。 coalesce 是“if”语句的一个特例,不是吗?和 switch - case 是一个特殊的,那么如何 - 删除它们?
  • 这不是你实现延迟实例化单例的方式。即使您只是为了简洁起见而省略了lock 块,它仍然只会混淆代码。
  • 我不需要总是一个懒惰的单身:) 生活有时很悲伤
  • 你的意思是线程安全,而不是懒惰,我猜?

标签: c# null-coalescing-operator


【解决方案1】:

对我来说,它本身转换为 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()); } 
}

【讨论】:

    【解决方案2】:

    在 C# 2.0 中引入 null-coalescing 运算符的原因是有一种方法可以将默认值分配给 nullable types,从而轻松地将可为 null 的类型转换为不可为 null 的类型。如果没有??,任何转换都需要冗长的if 语句。以下引用摘自MSDN:

    一个可为空的类型可以包含一个值, 或者它可以是未定义的。这 ?? 运算符将默认值定义为 当可空类型为空时返回 分配给不可为空的类型。如果 您尝试分配一个可为空的值 类型为不可为空的值类型 不使用 ??接线员,你 会产生编译时错误。如果 您使用演员表和可为空的值 类型当前未定义,一个 InvalidOperationException 异常 会被抛出。

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

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

    代替

    int? x = null;
    int y = -1;
    
    if (x.HasValue)
    {
        y = x.Value;
    }
    

    【讨论】:

    • 是的,我应该指定一个链通常是关于可空值的。谢谢。
    • 空合并运算符实际上是在 C# 2.0 中引入的,而不是 3.0(与可空类型相同)
    猜你喜欢
    • 2010-10-11
    • 2010-10-26
    • 2017-10-24
    • 2021-02-25
    • 2011-05-10
    • 1970-01-01
    • 2023-03-10
    • 2010-10-14
    • 1970-01-01
    相关资源
    最近更新 更多