C#StackTrace不包括调用new运算符

时间:2011-05-08 19:48:26

标签: c# .net stack-trace new-operator

我来自C ++,我不明白为什么在C#中写作:

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

当我检查构造函数中的StackTrace对象时,我无法在“f()”函数调用和“A()”构造函数之间找到对new()运算符的调用。

为什么省略new()运算符?或者我做错了什么?

2 个答案:

答案 0 :(得分:3)

没有单独的new函数调用。只是构造函数调用。

答案 1 :(得分:0)

我的.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()”评估两个单独的调用。第一个可能是“内存分配”,而第二个调用是对象的构造函数。我这样说是因为两个语句调用的第一个方法是相同的(即使它们是不同的类型),并且每种情况下的第二个调用都是不同的。

如果有人知道如何验证这些特定地址评估的内容,我很想知道。