我知道做(myValue ?? new SomeClass())类似于(myValue == null?new SomeClass():myValue)
但出于好奇,当我打电话给某个功能时,是否有任何性能优势
(getResult()?? new SomeClass()). getResult()会执行两次吗?这似乎是不直观的,因为我已经指定了方法调用一次.
解决方法
那么,如果通过“缓存”表示将其存储在一个临时变量中,那么是的.
这个结构:
var result = (getResult() ?? new SomeClass());
可以认为是等同于:
var <temp> = getResult(); if (<temp> == null) <temp> = new SomeClass(); result = <temp>;
这也告诉你第二部分,操作数后?如果第一个操作数不为空,则完全不执行.
所以回答你的具体问题:
>每个操作数最多被评估一次
>第二个操作数仅在第一个计算结果为null时进行评估
还请注意,您可以链接这些:
var result = first() ?? second() ?? third() ?? fourth();
其结果如下:
>评估第一()
>如果first()被评估为null,则评估second()
>如果second()被评估为null,则评估third()
>如果以上所有评估为null,最后评估第四
结果是返回的第一个(不是双关语)非空值.
var result = first?.second?.third;
这是基本的处理,即它会读取第一个第二个成员,然后是第二个成员的第三个成员,但是它将在第一个null处停止,并且还将确保仅对每个步骤进行一次评估:
(obj as IDisposable)?.Dispose();
obj作为IDisposable只会评估一次.
TryGetObjectToSave()?.Save();