null coalescing operator将结果缓存在c#

前端之家收集整理的这篇文章主要介绍了null coalescing operator将结果缓存在c#前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我知道做(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,最后评估第四

结果是返回的第一个(不是双关语)非空值.

这种类型的代码即将在新的C#中获得更好的新功能.操作符:

var result = first?.second?.third;

这是基本的处理,即它会读取第一个第二个成员,然后是第二个成员的第三个成员,但是它将在第一个null处停止,并且还将确保仅对每个步骤进行一次评估:

(obj as IDisposable)?.Dispose();

obj作为IDisposable只会评估一次.

TryGetObjectToSave()?.Save();

只会调用TryGetObjectToSave()一次,如果它返回某些东西,那么将调用Save()方法.

猜你在找的C#相关文章