null合并运算符是否将结果缓存在c#中
我知道做(myValue ?? new SomeClass())
类似于(myValue == null ? new SomeClass() : myValue)
但出于好奇,当我调用一个函数时,是否有任何性能优势,比如说(getResult() ?? new SomeClass())
。 getResult()
会被执行两次吗? 这似乎不直观,因为我只指定了一次方法调用。
好吧,如果通过“缓存”意味着将其存储在临时变量中,那么是的。
这个结构:
var result = (getResult() ?? new SomeClass());
可以被认为是等同于:
var = getResult(); if ( == null) = new SomeClass(); result = ;
这也告诉你第二部分,后面的操作数??
如果第一个操作数不为null
则根本不执行。
那么回答你的具体问题:
- 每个操作数最多评估一次
- 仅当第一个操作数的计算结果为
null
才会计算第二个操作数
另请注意,您可以链接这些:
var result = first() ?? second() ?? third() ?? fourth();
结果如下:
-
first()
评估first()
- 如果
first()
计算为null
,则计算second()
- 如果
second()
评估为null
,则计算third()
- 如果以上所有评估为
null
,则最终评估fourth
结果是返回的第一个(无双关语)非空值。
这种类型的代码即将在使用新的C#的新C#中变得更好?.
运营商:
var result = first?.second?.third;
这是基本的.
处理,即。 它将读取第一个的second
成员,然后是third
成员,但它将在第一个null
处停止,并且还将确保仅评估每个步骤一次:
(obj as IDisposable)?.Dispose();
obj as IDisposable
只会评估一次。
TryGetObjectToSave()?.Save();
只调用一次TryGetObjectToSave()
,如果它返回一些东西,将调用该东西的Save()
方法。