Ссылка на объект от конструктора? - PullRequest
2 голосов
/ 14 января 2020

Когда мы читаем, что при создании объекта для класса, подобного MyClass myClass = new MyClass();, будет создан экземпляр, и указатель ссылки будет сохранен в памяти стека. Если у класса нет конструктора, будет вызван конструктор по умолчанию, а затем скажем, что конструктор по умолчанию вернет указатель. Возьмите случай, когда у класса есть непараметрический конструктор, тогда ссылка из моего конструктора не будет возвращена. Затем откуда будет возвращен указатель на ссылку и как он будет создан.

Ответы [ 2 ]

1 голос
/ 14 января 2020

Указатель не приходит из конструктора. Создание объекта и выполнение конструктора - это два разных действия.

Спецификация языка 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 который создает объект.

Затем следует вызов конструктора, который инициализирует объект, но в этот момент объект был выделен, и у нас есть указатель на него. Конструктор не создает экземпляр, он инициализирует его.

Подробнее об этом от Вэнса Моррисона здесь .

1 голос
/ 14 января 2020

Краткий ответ: все конструкторы возвращают созданный объект.

Если у класса нет конструктора, будет вызван конструктор по умолчанию, а затем скажем, что конструктор по умолчанию вернет указатель.

Вы правы. Однако то, что вы называете «конструктором по умолчанию», на самом деле является конструктором без параметров , таким как public MyClass(). И компилятор генерирует один по умолчанию , если программист не написал его.

Возьмите случай, когда у класса есть непараметрический конструктор, тогда ссылка не будет возвращено из моего конструктора.

Если под "непараметрическим конструктором" вы подразумеваете конструктор с одним или несколькими параметрами, такими как public MyClass(int arg), то компилятор не будет генерировать конструктор без параметров по умолчанию. Однако компилятор гарантирует, что вы вызываете только те конструкторы, которые были определены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...