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

发布于 2024-11-05 11:29:59 字数 267 浏览 5 评论 0原文

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

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

当我检查构造函数内的 StackTrace 对象时,我无法在“f()”函数调用和“ A()”构造函数。

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

I come from C++ and I don't understand why in C# when I write :

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

When I inspect the StackTrace object inside the constructor I can't find the call to the new() operator between "f()" function call and the "A()" constructor.

Why is the the new() operator omitted? or am I doing something wrong?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

梦年海沫深 2024-11-12 11:29:59

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

There is no separate new function call. Just the constructor call.

嘿看小鸭子会跑 2024-11-12 11:29:59

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

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

My .Net Disassembly skill smay be weak, but here is what I get allocating two different objects:

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

The way I am interpreting this is that "new X()" evaluates to two seperate calls. The first might be the "memory allocation" while the second call is the constructor of the object. I say this because the first method called by both statements is the same (even though they are different types), and the second call in each case is different.

If anyone knows how to verify what these specific addresses evaluate to, I would love to know.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文