- Is the null coalesce operator thread safe?
- public class Foo
- {
- Object _bar;
- public Object Bar
- {
- get { return _bar ?? new Object(); }
- set { _bar = value; }
- }
- }
- get { return _bar != null ? _bar : new Object(); }
- public static T GetValue<T>(ref T value) where T : class, new()
- {
- return value ?? new T();
- }
- public static T GetValue<T>(ref T value) where T : class, new()
- {
- T result = value;
- if (result != null)
- return result;
- else
- return new T();
- }
- .method public hidebysig specialname instance object get_Bar() cil managed
- {
- .maxstack 2
- .locals init (
- [0] object CS$1$0000)
- L_0000: nop
- L_0001: ldarg.0
- L_0002: ldfld object ConsoleApplication1.Program/MainClass::_bar
- L_0007: dup
- L_0008: brtrue.s L_0010
- L_000a: pop
- L_000b: newobj instance void [mscorlib]System.Object::.ctor()
- L_0010: stloc.0
- L_0011: br.s L_0013
- L_0013: ldloc.0
- L_0014: ret
- }
- get { return _bar != null ? _bar : new Object(); }
- get
- {
- Object result = _bar;
- if(result == null)
- {
- result = new Object();
- }
- return result;
- }
- public class Foo
- {
- Object _bar = new Object();
- public Object Bar
- {
- get { return _bar; }
- set { _bar = value ?? new Object(); }
- }
- }
- .method public hidebysig specialname instance object get_Bar_NullCoalesce() cil managed
- {
- .maxstack 8
- L_0000: ldarg.0 // Load argument 0 onto the stack (I don't know what argument 0 is, I don't understand this statement.)
- L_0001: ldfld object CoalesceTest::_bar // Loads the reference to _bar onto the stack.
- L_0006: dup // duplicate the value on the stack.
- L_0007: brtrue.s L_000f // Jump to L_000f if the value on the stack is non-zero.
- // I believe this consumes the value on the top of the stack, leaving the original result of ldfld as the only thing on the stack.
- L_0009: pop // remove the result of ldfld from the stack.
- L_000a: newobj instance void [mscorlib]System.Object::.ctor()
- // create a new object, put a reference to it on the stack.
- L_000f: ret // return whatever's on the top of the stack.
- }
- .method public hidebysig specialname instance object get_Bar_IntermediateResultVar() cil managed
- {
- .maxstack 1
- .locals init (
- [0] object result)
- L_0000: ldarg.0
- L_0001: ldfld object CoalesceTest::_bar
- L_0006: stloc.0
- L_0007: ldloc.0
- L_0008: brtrue.s L_0010
- L_000a: newobj instance void [mscorlib]System.Object::.ctor()
- L_000f: stloc.0
- L_0010: ldloc.0
- L_0011: ret
- }
- .method public hidebysig specialname instance object get_Bar_TrinaryOperator() cil managed
- {
- .maxstack 8
- L_0000: ldarg.0
- L_0001: ldfld object CoalesceTest::_bar
- L_0006: brtrue.s L_000e
- L_0008: newobj instance void [mscorlib]System.Object::.ctor()
- L_000d: ret
- L_000e: ldarg.0
- L_000f: ldfld object CoalesceTest::_bar
- L_0014: ret
- }
- public object Bar_NullCoalesce
- {
- get { return this._bar ?? new Object(); }
- }
- public object Bar_IntermediateResultVar
- {
- get
- {
- object result = this._bar;
- if (result == null) { result = new Object(); }
- return result;
- }
- }
- public object Bar_TrinaryOperator
- {
- get { return this._bar != null ? this._bar : new Object(); }
- }
- List<int> l = null;
- var x = l ?? new List<int>();
- [STAThread]
- public static void Main(string[] args)
- {
- List<int> list = null;
- if (list == null)
- {
- new List<int>();
- }
- }