空合并运算符是否在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
.
,则第二部分 ??
之后的操作数根本不会执行
所以回答你的具体问题:
- 每个操作数最多计算一次
- 仅当第一个操作数的计算结果为
null
时才计算第二个操作数
另请注意,您可以链接这些:
var result = first() ?? second() ?? third() ?? fourth();
这导致:
- 评价
first()
- 如果
first()
评估为 null
,则评估为 second()
- 如果
second()
也评估为 null
,则评估 third()
- 如果以上都求值为
null
,最后求值为fourth
结果是返回的第一个(没有双关语意)非空值。
这种类型的代码将在新的 C# 中使用新的 ?.
运算符变得更好:
var result = first?.second?.third;
这是基本的 .
处理,即。它将读取 first
的 second
成员,然后是 second
的 third
成员,但它将在第一个 null
处停止,并将还要确保每个步骤只评估一次:
(obj as IDisposable)?.Dispose();
obj as IDisposable
只会评估一次。
TryGetObjectToSave()?.Save();
只会调用 TryGetObjectToSave()
一次,如果它 returns 某物,将调用该某物的 Save()
方法。
我知道 (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
.
??
之后的操作数根本不会执行
所以回答你的具体问题:
- 每个操作数最多计算一次
- 仅当第一个操作数的计算结果为
null
时才计算第二个操作数
另请注意,您可以链接这些:
var result = first() ?? second() ?? third() ?? fourth();
这导致:
- 评价
first()
- 如果
first()
评估为null
,则评估为second()
- 如果
second()
也评估为null
,则评估third()
- 如果以上都求值为
null
,最后求值为fourth
结果是返回的第一个(没有双关语意)非空值。
这种类型的代码将在新的 C# 中使用新的 ?.
运算符变得更好:
var result = first?.second?.third;
这是基本的 .
处理,即。它将读取 first
的 second
成员,然后是 second
的 third
成员,但它将在第一个 null
处停止,并将还要确保每个步骤只评估一次:
(obj as IDisposable)?.Dispose();
obj as IDisposable
只会评估一次。
TryGetObjectToSave()?.Save();
只会调用 TryGetObjectToSave()
一次,如果它 returns 某物,将调用该某物的 Save()
方法。