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?
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?
I don't think this a bad use of the null-coalescing operator. When reading the code, it is as short and concise as possible, and the intent of the code is obvious.
It is correct that using the null-coalescing operator like this, you will always get an assignment, but I would not worry about that. (And if it really turns out to be a performance issue, you already know how to fix it).
You are correct in that the first line will always make an assignment. I would not worry about that unless the code is executed very often.
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 oncsc.exe
). This is what I got (using VS 2008 - note thatFoo.MaybeFoo()
is a method that sometimes returnsnull
, sometimes aFoo
)GetFooWithIf
:GetFooWithCoalescingOperator
: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!