You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用空合并运算符??更新值是否存在冗余读写?效率是否逊于条件判断?

关于bar.Foo = qux.Foo ?? bar.Foo的执行逻辑与性能问题

先明确执行逻辑:当qux.Foo为null时,这条语句不会跳过操作——它会先读取bar.Foo的当前值,再把这个值重新赋值给bar.Foo。也就是说,赋值动作是一定会发生的,只是右边的取值在null时回退到原属性值。

再聊性能影响,得分情况讨论:

  • 如果Foo是引用类型(比如string、byte数组这类):读写的只是对象的引用地址(64位系统下仅8字节),哪怕对象本身是MB级的base64数据,这种引用操作的开销可以忽略,不会有明显性能问题。
  • 如果Foo是值类型(比如自定义的大型结构体):读取和赋值都会触发整个结构体的内存拷贝,MB级的数据量会带来可观的CPU和内存开销,这时候冗余操作就会影响效率。

如果想兼顾代码简洁和性能,有两种可行方案:

  • 回到最稳妥的条件判断写法,虽然多几行,但完全避免冗余操作:
    if (qux.Foo != null)
    {
        bar.Foo = qux.Foo;
    }
    
  • 封装一个简单的扩展方法,把判断逻辑抽离,调用时保持简洁:
    public static void UpdateIfNotNull<T>(ref T target, T source) where T : class
    {
        if (source != null) target = source;
    }
    
    // 调用示例
    UpdateIfNotNull(ref bar.Foo, qux.Foo);
    

内容的提问来源于stack exchange,提问作者Aravaslac

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 15:59:57