2011-05-08 48 views
1

我来自C++,我不明白为什么在C#,当我写:C#堆栈跟踪不包含调用新的运营商

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

当我检查构造函数中的堆栈跟踪的对象,我不能找到调用“f()”函数调用和“A()”构造函数之间的new()运算符。

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

回答

3

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

0

我的.Net技能拆卸是smay弱,但这里是我所得到的分配两个不同的对象:

 { 
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 
     } 

我解释这个问题的方法是,“新X()”的计算结果为两个单独的呼叫。第一个可能是“内存分配”,而第二个调用是该对象的构造函数。我这样说是因为两个语句调用的第一个方法是相同的(即使它们是不同的类型),第二个调用在每种情况下都是不同的。

如果有人知道如何验证这些具体的地址评估什么,我很想知道。