我来自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()”的计算结果为两个单独的呼叫。第一个可能是“内存分配”,而第二个调用是该对象的构造函数。我这样说是因为两个语句调用的第一个方法是相同的(即使它们是不同的类型),第二个调用在每种情况下都是不同的。
如果有人知道如何验证这些具体的地址评估什么,我很想知道。