C # StackTrace не включая вызов нового оператора - PullRequest
1 голос
/ 08 мая 2011

Я пришел из C ++, и я не понимаю, почему в C #, когда я пишу:

class A {
    public A(){ /*here I get the StackTrace */}
    //......other code
    void f(){ A a = new A();
}

Когда я проверяю объект StackTrace внутри конструктора, я не могу найти вызов оператора new () между вызовом функции "f ()" и конструктором "A ()".

Почему оператор new () опущен? или я что-то не так делаю?

Ответы [ 2 ]

3 голосов
/ 08 мая 2011

Нет отдельного вызова функции new.Просто вызов конструктора.

0 голосов
/ 09 мая 2011

Мой навык разборки .Net может быть слабым, но вот что я получаю, выделяя два разных объекта:

        {
00000022  nop 
            new Object();
00000023  mov         ecx,79B9F5E8h 
00000028  call        FD95FB90 
0000002d  mov         dword ptr [ebp-3Ch],eax 
00000030  mov         ecx,dword ptr [ebp-3Ch] 
00000033  call        76AF49F0 
00000038  nop 
        }
00000039  nop 
        {
0000003a  nop 
            new StringBuilder();
0000003b  mov         ecx,79B9FB78h 
00000040  call        FD95FB90 
00000045  mov         dword ptr [ebp-40h],eax 
00000048  mov         ecx,dword ptr [ebp-40h] 
0000004b  call        76ACF938 
00000050  nop 
        }

То, как я интерпретирую это, заключается в том, что «new X ()» оценивается как два отдельныхзвонки.Первым может быть «выделение памяти», а вторым вызовом является конструктор объекта.Я говорю это потому, что первый метод, вызываемый обоими операторами, один и тот же (даже если они разных типов), а второй вызов в каждом случае различен.

Если кто-то знает, как проверить, что оценивают эти конкретные адресак, я бы хотел знать.

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