空合并运算符是否在c#中缓存结果

Does null coalescing operator cache the result in c#

我知道 (myValue ?? new SomeClass()) 类似于 (myValue == null ? new SomeClass() : myValue)

但出于好奇,当我调用函数时是否有任何性能优势,比如 (getResult() ?? new SomeClass())getResult() 会被执行两次吗?这似乎不直观,因为我只指定了一次方法调用。

好吧,如果 "caching" 你的意思是将它存储在一个临时变量中,那么是的。

这个结构:

var result = (getResult() ?? new SomeClass());

可以认为等同于:

var <temp> = getResult();
if (<temp> == null)
    <temp> = new SomeClass();
result = <temp>;

这也告诉你,如果第一个操作数不是 null.

,则第二部分 ?? 之后的操作数根本不会执行

所以回答你的具体问题:

  1. 每个操作数最多计算一次
  2. 仅当第一个操作数的计算结果为 null
  3. 时才计算第二个操作数

另请注意,您可以链接这些:

var result = first() ?? second() ?? third() ?? fourth();

这导致:

  1. 评价first()
  2. 如果 first() 评估为 null,则评估为 second()
  3. 如果 second() 也评估为 null,则评估 third()
  4. 如果以上都求值为null,最后求值为fourth

结果是返回的第一个(没有双关语意)非空值。


这种类型的代码将在新的 C# 中使用新的 ?. 运算符变得更好:

var result = first?.second?.third;

这是基本的 . 处理,即。它将读取 firstsecond 成员,然后是 secondthird 成员,但它将在第一个 null 处停止,并将还要确保每个步骤只评估一次:

(obj as IDisposable)?.Dispose();

obj as IDisposable 只会评估一次。

TryGetObjectToSave()?.Save();

只会调用 TryGetObjectToSave() 一次,如果它 returns 某物,将调用该某物的 Save() 方法。