好吧,如果“缓存”是指将其存储在临时变量中,那么是的。
这个构造:
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()
- If
first()
评估为null
, 评估second()
- If
second()
评估为null
以及评估third()
- 如果以上所有评估结果为
null
,最后评价fourth
结果是返回的第一个(没有双关语)非空值。
这种类型的代码在新的 C# 中将通过新的?.
操作员:
var result = first?.second?.third;
这是基本的.
处理,即。它将读取second
成员first
,然后是third
任何事物的成员second
是,但它会在第一个时停止null
,并且还将确保每个步骤仅评估一次:
(obj as IDisposable)?.Dispose();
obj as IDisposable
只会评估一次。
TryGetObjectToSave()?.Save();
只会打电话TryGetObjectToSave()
一次,如果它返回一些东西,Save()
方法将被调用。