Bad Use of Null Coalescing Operator?
c#, null-coalescing-operator
Solution
I compared the CIL of the generated code (making sure to do a Release build - with Optimize Code checked in the Project Properties, which corresponds to the `/optimize` switch on `csc.exe`). This is what I got (using VS 2008 - note that `Foo.MaybeFoo()` is a method that sometimes returns `null`, sometimes a `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
Thus, the same except for an extra top-of-stack-duplication and pop. If this can be made to make a measurable performance difference, I will purchase a hat specifically for the purpose of eating it; therefore, go with the one that you feel offers better readability.
(edit) oh, and the JITter might be clever enough to get rid of even that difference!
Problem
``` myFoo = myFoo ?? new Foo(); ``` instead of ``` if (myFoo == null) myFoo = new Foo(); ``` Am I correct in thinking that the first line of code will always perform an assignment? Also, is this a bad use of the null-coalescing operator?