Инициализация поля происходит до вызова конструктора через команду newobj
. Это легко проверить, после декомпиляции исполняемого файла со следующим C# код:
using System;
namespace ConsoleApplication1
{
public class A { public int j; }
class Program
{
static void Main(string[] args)
{
A g = new A();
Console.WriteLine(g.j);
}
}
}
Часть decompilted кода MSIL (метод основной):
//000017: {
IL_0000: nop
//000018: A g = new A();
IL_0001: newobj instance void ConsoleApplication1.A::.ctor()
IL_0006: stloc.0
//000019: Console.WriteLine(g.j);
IL_0007: ldloc.0
IL_0008: ldfld int32 ConsoleApplication1.A::j
IL_000d: call void [mscorlib]System.Console::WriteLine(int32)
IL_0012: nop
//000020: }
Как мы можем видеть MSIL использует newobj
инструкции для создания экземпляра класса A. Согласно следующему microsoft acticle:
Инструкция newobj выделяет новый экземпляр класса, связанного с CTOR и инициализирует все поля в новом экземпляре до 0 (от соответствующего типа) или нулевые ссылки как подходящее. Затем он вызывает конструктор с указанными аргументами вместе с вновь созданным экземпляром .После вызова конструктора теперь инициализированная ссылка на объект (тип O) помещается в стек.
Если это неверно, прокомментируйте, иначе назначьте его как правильный ответ, пожалуйста.
Как получить j будет инициализирован до нуля в указанном выше контексте – sathishhanumandla
, если объявленный конструктор по умолчанию будет выполнен, когда мы объявим его как 'A a = new A();' – sathishhanumandla