加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

null coalescing operator将结果缓存在c#

发布时间:2020-12-15 18:09:13 所属栏目:百科 来源:网络整理
导读:我知道做(myValue ?? new SomeClass())类似于(myValue == null?new SomeClass():myValue) 但出于好奇,当我打电话给某个功能时,是否有任何性能优势 (getResult()?? new SomeClass()). getResult()会执行两次吗?这似乎是不直观的,因为我已经指定了方法调用
我知道做(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()方法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读