题
myFoo = myFoo ?? new Foo();
,而不是
if (myFoo == null) myFoo = new Foo();
上午我在思考纠正的第一行代码将一直执行任务?此外,这是一个坏的使用空聚结操作的?
解决方案
我比较了生成的代码的CIL(确保做一个发布版本 - 与优化代码项目属性检查,其对应于上/optimize
的csc.exe
开关)。这是我得到(使用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
因此,除了额外的顶级的堆复制并弹出相同。如果这可以由作出衡量的性能差异,我会专门购买一顶帽子吃它的目的;因此,去与一个你的感觉,提供更好的可读性。
(编辑)哦,抖动可能是足够聪明的摆脱即使是差的!
其他提示
我不认为这是一个不好的使用空合并运算符的。当读取代码,它是作为简短的作为可能的,并且意图的代码是显而易见的。
这是正确的,使用空合并运算符这样,你总是会得到一个任务,但我不会担心。 (如果它的真正的原来是一个性能问题,你已经知道如何解决它)。
您在第一行会一直进行分配正确的。我不会担心,除非是经常执行的代码。
不隶属于 StackOverflow