我來自C++,我不明白爲什麼在C#,當我寫:C#堆棧跟蹤不包含調用新的運營商
class A {
public A(){ /*here I get the StackTrace */}
//......other code
void f(){ A a = new A();
}
當我檢查構造函數中的堆棧跟蹤的對象,我不能找到調用「f()」函數調用和「A()」構造函數之間的new()運算符。
爲什麼new()運算符被省略?或者我做錯了什麼?
我來自C++,我不明白爲什麼在C#,當我寫:C#堆棧跟蹤不包含調用新的運營商
class A {
public A(){ /*here I get the StackTrace */}
//......other code
void f(){ A a = new A();
}
當我檢查構造函數中的堆棧跟蹤的對象,我不能找到調用「f()」函數調用和「A()」構造函數之間的new()運算符。
爲什麼new()運算符被省略?或者我做錯了什麼?
沒有單獨的new
函數調用。只是構造函數調用。
我的.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()」的計算結果爲兩個單獨的呼叫。第一個可能是「內存分配」,而第二個調用是該對象的構造函數。我這樣說是因爲兩個語句調用的第一個方法是相同的(即使它們是不同的類型),第二個調用在每種情況下都是不同的。
如果有人知道如何驗證這些具體的地址評估什麼,我很想知道。