【问题标题】:What do you think about ??= operator in C#? [closed]您如何看待 C# 中的 ??= 运算符? [关闭]
【发布时间】:2011-02-02 12:48:35
【问题描述】:

你认为 C# 会支持 ??= 运算符之类的东西吗?

而不是这个:

if (list == null)
  list = new List<int>();

或许可以这样写:

list ??= new List<int>();

现在,我可以使用(但在我看来不太可读):

list = list ?? new List<int>();

【问题讨论】:

  • 那太酷了!不确定它是否支持它......但是是的,我喜欢它!
  • 这个想法建议让我的 Ruby 部分感到温暖。 (请参阅 Ruby ||= 运算符。)

标签: c# operators null-coalescing-operator null-coalescing


【解决方案1】:

我个人认为只有第二个扩展才有意义(就与+= 等保持一致而言):

list = list ?? new List<int>();

但老实说,我觉得这有点不必要。人们通常会“获取”i += 5;,但往往会遇到空合并问题 (??)。添加一个 null-coalescing-assignment 运算符,然后......好吧,我认为它的结局并不好。

我个人更喜欢原代码:

if(list == null) { list = new List<int>(); }
....

另外 - 考虑:在所有其他 +=-= 等中 - 总是评估右侧。在这种情况下,它不会(在某些情况下)。这增加了更多的混乱。我的意思是:

i += SomethingCriticalThatMustBeCalled(); // fine - always runs
j ??= SomethingElseCriticalThatMustBeCalled(); // is this run? if j != null?

【讨论】:

  • 我同意。这是在写入速度和可读性之间的选择。每次都以可读性取胜。
  • 我同意可读性非常有价值,但我发现 ??= 运算符相当容易掌握(再说一次,我喜欢 haskell 所以我可能习惯于任意运算符)。但我不认为马克的第二个例子是一个很好的例子。无论如何,您不应该将关键代码作为 += 的副作用来运行,所以它非常做作。
【解决方案2】:

我一直想要这样的东西。我会比?? 更频繁地使用它。

不过,我真正想要的是一种运算符,它允许您仅在非 null 时取消引用该对象。要替换它:

    int count = (list != null)? list.Count : 0

类似这样的:

    int count = list??.Count : 0

这对我来说特别有用,因为我有很长的参考链(糟糕的设计,我知道),但是例如

    int count = foo??.bar??.baz??.list??.Count : 0

目前?? 无法做到这一点,因为您只能说“分配给 foo,或者如果为空则替代”,但不能说“分配给 foo 的 属性,或者替代如果空。”

【讨论】:

  • 虽然我同意,但我认为这与 C# 的一般工作方式背道而驰。它让我想起了更多像 Obj-C 这样的消息传递语言,其中 [list count];将返回 null 而不是触发 null 异常错误。在 C# 中,它使语法更加混乱,尤其是因为在这种情况下,您几乎总是想使用它。
  • 我当然同意,就像任何事情一样,落入坏人手中可能会很危险。我绝不建议通过忽略所有空引用来替代错误处理。但是在某些情况下,null 是完全可以接受的,在这种情况下您可以使用有效的替代值。
  • 这是一个经常被请求的功能。我们正在考虑。
  • 我建议宁可 foo?.bar?.baz ... 会有更少的混乱:) 并且它将与 Groovy 中的保存导航兼容:groovy.codehaus.org/Statements#Statements-Safenavigation
【解决方案3】:

我在 stackoverflow 的某处发现的一个技巧是做这样的事情......

private List<string> myList;
public List<string> MyProp 
{
    get { return myList ?? (myList= new List<string>()); }
}

...您也许可以在代码中使用类似的惰性 eval。

【讨论】:

    【解决方案4】:

    我喜欢它——这是一种很好、简洁的方式来表达延迟加载表达式。是否将其添加到语言中完全是另一回事 - 正如Eric Lippert loves to point out 一样,新功能需要大量工作才能实现,因此它们必须对语言做出显着的净正面影响才能被纳入。

    【讨论】:

    • 确实,我在这里没有看到巨大的好处。我有点惊讶的是,什么时候没有添加“空值合并赋值”运算符??已添加,但实际上并没有增加很多功能。
    【解决方案5】:

    除非我读错了你的问题,否则 C# 中确实存在该运算符:http://msdn.microsoft.com/en-us/library/ms173224(VS.80).aspx

    【讨论】:

      猜你喜欢
      • 2010-10-04
      • 2010-09-05
      • 2023-03-20
      • 2019-10-06
      • 2012-09-24
      • 2011-03-26
      • 1970-01-01
      • 2010-09-09
      • 1970-01-01
      相关资源
      最近更新 更多