gpt4 book ai didi

c# - 空合并运算符的错误使用?

转载 作者:太空狗 更新时间:2023-10-29 18:02:52 24 4
gpt4 key购买 nike

myFoo = myFoo ?? new Foo();

代替

if (myFoo == null) myFoo = new Foo();

我认为第一行代码总是执行赋值的想法是否正确?另外,这是对空合并运算符的错误使用吗?

最佳答案

我比较了生成代码的 CIL(确保进行发布构建 - 在项目属性中选中优化代码,这对应于 csc.exe 上的 /optimize 开关)。这就是我得到的(使用 VS 2008 - 请注意 Foo.MaybeFoo() 是一种有时返回 null,有时返回 Foo 的方法)

GetFooWithIf:

  IL_0000:  call       class Application3.Foo Application3.Foo::MaybeFoo()
IL_0005: stloc.0
IL_0006: ldloc.0
IL_0007: brtrue.s IL_000f
IL_0009: newobj instance void Application3.Foo::.ctor()
IL_000e: stloc.0
IL_000f: ldloc.0
IL_0010: ret

GetFooWithCoalescingOperator:

  IL_0000:  call       class Application3.Foo Application3.Foo::MaybeFoo()
IL_0005: stloc.0
IL_0006: ldloc.0
IL_0007: dup
IL_0008: brtrue.s IL_0010
IL_000a: pop
IL_000b: newobj instance void Application3.Foo::.ctor()
IL_0010: stloc.0
IL_0011: ldloc.0
IL_0012: ret

因此,除了额外的栈顶复制和弹出之外,其他都是一样的。如果这可以产生可衡量的性能差异,我会购买一顶专门用于食用的帽子;因此,请选择您认为可读性更好的那个。

(编辑)哦,JITter 可能足够聪明,甚至可以消除这种差异!

关于c# - 空合并运算符的错误使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1791852/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com