使用空合并运算符??更新值是否存在冗余读写?效率是否逊于条件判断?
关于
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
相关产品推荐
相关产品推荐

