2011-05-08 45 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()」的計算結果爲兩個單獨的呼叫。第一個可能是「內存分配」,而第二個調用是該對象的構造函數。我這樣說是因爲兩個語句調用的第一個方法是相同的(即使它們是不同的類型),第二個調用在每種情況下都是不同的。

如果有人知道如何驗證這些具體的地址評估什麼,我很想知道。