Join the Stack Overflow Community
Stack Overflow is a community of 6.7 million programmers, just like you, helping each other.
Join them; it only takes a minute:
Sign up

I have simple program like this:

public class Foo
{
    public Foo()
    {
    }
    public int MyInt { get; set; } = 10;
    public List<int> MyList { get; set; } = new List<int>();
}

public class Program
{
    static public void Main()
    {
        Console.WriteLine(new Foo().MyInt);
        Console.ReadLine();
    }
}

I decided to see il code of such program (I am interested in Foo's constructor). Here is it:

.method public hidebysig specialname rtspecialname 
        instance void  .ctor() cil managed
{
// Code size       26 (0x1a)
.maxstack  8
IL_0000:  ldarg.0
IL_0001:  ldc.i4.s   10
IL_0003:  stfld      int32 Foo::'<MyInt>k__BackingField'
IL_0008:  ldarg.0
IL_0009:  newobj     instance void class [mscorlib]System.Collections.Generic.List`1<int32>::.ctor()
IL_000e:  stfld      class [mscorlib]System.Collections.Generic.List`1<int32> Foo::'<MyList>k__BackingField'
IL_0013:  ldarg.0
IL_0014:  call       instance void [mscorlib]System.Object::.ctor()
IL_0019:  ret
} // end of method Foo::.ctor

I wondered, when I saw second line - ldarg.0. What does it mean? this pointer? but object was not created yet. How can I modify its members? My assumption is that before calling constructor, clr firstly allocates memory for object. Then initializes members to default values, then invokes constructor. Another interesting moment that object calling is last. I thought that it will be first.

share|improve this question
3  
Your guess is correct. arg0 is this. Note that this is the case for all instance methods, the constructor is not special in this sense. The exact process is described in the newobj opcode docs, which is used to allocate and then initialize the object via the constructor. – mike z 1 hour ago
    
@mikez, Excellent link! It is what I need – LmTinyToon 1 hour ago

Field initializers are a C# feature, not a CLR one. When you write a field initializer, the C# compiler has to put the code to implement that somewhere, and where it puts it is inside the body of any constructors.

And since these initializers are run "before" the constructor, that's why the actual base-class constructor is run later.

(And so, yes, the first parameter is as you inferred, this)

share|improve this answer
    
I hope by "initializers" you refer to the fields being intialized before any ctor-call. In contrast to this object-initializers run after the constructor as far as I know. – HimBromBeere 1 hour ago
    
@HimBromBeere - I'd hoped it was clear from the first para that I was referring to field initializers which is a well-defined term in C#. I've slightly modified the second para to make it clear I'm still referring to field initializers. – Damien_The_Unbeliever 1 hour ago
    
Another interesting thought that why initializations was put before calling invoking base class constructor. Maybe because of possible invoking virtual methods from base class constructor (which can actually work with data of derived class) – LmTinyToon 1 hour ago
1  
@LmTinyToon - I think you have to pick some order between field initializers, base-class constructor and instance constructor. And since instance constructor and base-class constructor are both described at the same "place", it's less thinking that those two are more closely tied together. (For the scenario where your instance constructor is Foo() : base(something)) – Damien_The_Unbeliever 1 hour ago

http://www.philosophicalgeek.com/2014/09/29/digging-into-net-object-allocation-fundamentals/

According to the above article, the CLR allocates memory first before calling into the constructor, the same way object construction happens in C++.

share|improve this answer

Although the object is not 'created' in the strictest sense before the constructor call, there must be some memory allocated for it. I don't know the details, but I would guess that all instance methods of a class have an implicit first parameter, which is this; this would also be true for the constructor, as it needs to reference the object instance like any other instance method.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.