myFoo = myFoo ?? new Foo();

,而不是

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

上午我在思考纠正的第一行代码将一直执行任务?此外,这是一个坏的使用空聚结操作的?

有帮助吗?

解决方案

我比较了生成的代码的CIL(确保做一个发布版本 - 与优化代码项目属性检查,其对应于上/optimizecsc.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

因此,除了额外的顶级的堆复制并弹出相同。如果这可以由作出衡量的性能差异,我会专门购买一顶帽子吃它的目的;因此,去与一个你的感觉,提供更好的可读性。

(编辑)哦,抖动可能是足够聪明的摆脱即使是差的!

其他提示

我不认为这是一个不好的使用空合并运算符的。当读取代码,它是作为简短的作为可能的,并且意图的代码是显而易见的。

这是正确的,使用空合并运算符这样,你总是会得到一个任务,但我不会担心。 (如果它的真正的原来是一个性能问题,你已经知道如何解决它)。

您在第一行会一直进行分配正确的。我不会担心,除非是经常执行的代码。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top