Указатель не приходит из конструктора. Создание объекта и выполнение конструктора - это два разных действия.
Спецификация языка C# (1.6.7.1) гласит:
Конструктор экземпляра - это член, который реализует действия, необходимые для инициализации экземпляра класса
Следовательно, конструктор не создает объект. Вместо этого он инициализирует память, связанную с объектом. В приведенном ниже простом примере создание обрабатывается CORINFO_HELP_NEWFAST
, но это только один из нескольких способов создания объекта, как указано в сообщении, связанном ниже.
Для иллюстрации рассмотрим простую программу, подобную этой.
class Program {
static void Main(string[] args) {
var p = new Program();
Console.ReadLine();
Console.WriteLine(p.GetType());
}
public Program() {
Console.WriteLine("ctor");
}
}
, которая компилируется в следующий код.
00760848 55 push ebp
00760849 8bec mov ebp,esp
0076084b 56 push esi
0076084c b9504d7100 mov ecx,714D50h (MT: ConsoleApp3.Program)
00760851 e87228faff call 007030c8 (JitHelp: CORINFO_HELP_NEWSFAST)
00760856 8bf0 mov esi,eax
00760858 8bce mov ecx,esi
0076085a ff15704d7100 call dword ptr ds:[714D70h] (ConsoleApp3.Program..ctor(), mdToken: 06000002)
00760860 e82bf32973 call mscorlib_ni+0xb8fb90 (739ffb90) (System.Console.ReadLine(), mdToken: 06000b6a)
00760865 8bce mov ecx,esi
00760867 e8d0f8ffff call 0076013c (System.Object.GetType(), mdToken: 0600022e)
0076086c 8bc8 mov ecx,eax
0076086e e88d1ead72 call mscorlib_ni+0x3c2700 (73232700) (System.Console.WriteLine(System.Object), mdToken: 06000b77)
00760873 5e pop esi
00760874 5d pop ebp
00760875 c3 ret
Обратите внимание, что первым действием является вызов CORINFO_HELP_NEWFAST
который создает объект.
Затем следует вызов конструктора, который инициализирует объект, но в этот момент объект был выделен, и у нас есть указатель на него. Конструктор не создает экземпляр, он инициализирует его.
Подробнее об этом от Вэнса Моррисона здесь .