我知道(myValue ?? new SomeClass())
与(myValue == null ? new SomeClass() : myValue)
但出于好奇,当我调用一个函数时,是否有任何性能优势,比如说
(getResult() ?? new SomeClass())
。 getResult()
会被执行两次吗?这似乎不直观,因为我只指定了一次方法调用。
答案 0 :(得分:15)
好吧,如果通过“缓存”意味着将其存储在临时变量中,那么是。
这个结构:
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;
这是基本的.
处理,即。它会读取second
的{{1}}成员,然后是first
成员third
,但会在第一个second
停止,并且会还要确保只评估每一步:
null
(obj as IDisposable)?.Dispose();
只评估一次。
obj as IDisposable
只会调用TryGetObjectToSave()?.Save();
一次,如果它返回某些内容,则会调用该TryGetObjectToSave()
方法。