Constructor vs Object Initializer Precedence in C#

C#ConstructorObject Initializers

C# Problem Overview


I've been learning the object initializer in C# recently, but now I'm wondering how it works when it conflicts with the constructor.

public class A
{
    public bool foo { get; set; }

    public A()
    {
        foo = true;
    }

    public A(bool bar)
    {
        foo = bar;
    }
}

What happens when I try this?

public class B
{
    private A a = new A() { foo = false };

    private A b = new A(true) { foo = false };
}

Is a default in the constructor a good way to have a bool that starts true and can be changed?

public A(bool bar = true)
{
    foo = bar;
}

C# Solutions


Solution 1 - C#

From the documentation:

> The compiler processes object initializers by first accessing the > default instance constructor and then processing the member > initializations.

This means that in the simplest case (named object initialization) it is basically shorthand (or syntactic sugar) for calling the default constructor and then calling the property setter(s). In the case of anonymous types this kind of initialization is actually required and not mere sugar.

For the 2nd part of your question: It's more of a matter of style but if you have a crucial property I would not create a constructor with a default value. Make the client code set the value explicitly. I'm also not sure why doing something like this: b = A(true) {foo = false}; would be a good idea unless you're in a code obfuscation contest.

Bit of caution though:

> ... if the default constructor is declared as private in the class, > object initializers that require public access will fail.

Solution 2 - C#

Object initializers are just syntactic sugar, in your compiled assembly IL they translate into separate statements, check it on ILSpy.

enter image description here

Solution 3 - C#

The constructor occurs first then the object initializer. Just remember that

a = new A() { foo = false };

is same as

var temp = new A();
temp.foo = false;
a = temp;

Solution 4 - C#

b = new A(true) {foo = false};

is effectively short for:

A temp = new A(true);
temp.foo = false;
A b = temp;

where temp is an otherwise inaccessible variable. The constructor is always executed first, followed by any initialised properties.

Solution 5 - C#

Essentially what Paul has already linked:

From the http://www.microsoft.com/en-us/download/details.aspx?id=7029">C# 5 language specification (7.6.10.1)

> Processing of an object creation expression that includes an object initializer or collection initializer consists of first processing the instance constructor and then processing the member or element initializations specified by the object initializer or collection initializer.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionbbillView Question on Stackoverflow
Solution 1 - C#Paul SasikView Answer on Stackoverflow
Solution 2 - C#Tamim Al ManaseerView Answer on Stackoverflow
Solution 3 - C#juharrView Answer on Stackoverflow
Solution 4 - C#LeeView Answer on Stackoverflow
Solution 5 - C#ChrisView Answer on Stackoverflow