获取对象调用层次结构

Yoc*_*mer 2 c# methods function object stack-trace

可以说我有3节课:

class A {
   void do_A() {
      //Check object call hierarchy
    }
}
class B {
   void do_B() {
      A a;
      a.do_A();
    }
}
class C {
   void do_C() {
      B b;
      b.do_A();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我打电话给:

C c;
c.do_C();
Run Code Online (Sandbox Code Playgroud)

如何从A的do_A()中获取对象调用层次结构?

我的意思是我希望在a.do_A()中获得对象的引用(可以很容易地实现this),对象b的引用调用a.do_A(),以及对象c的引用调用b.do_B().

我认为这应该是可能的,因为我可以通过调用堆栈获得调用层次结构,所以我确信我应该能够获得有关调用这些方法的对象的更多信息.

Eri*_*ert 12

首先,你所描述的是一个糟糕的编程习惯.方法的行为应该取决于它的参数,而不是取决于谁调用它.一个方法应该是可靠的,这样你就知道无论是谁调用它都会得到相同的行为.

其次,你似乎是常见但错误的信念,即调用堆栈是一个真实的东西,可以告诉你调用的来源.这完全不是调用堆栈的目的,但对于调试方案,它肯定是有用的.调用堆栈的目的是告诉您下一步的位置,而不是您来自何处.现在,通常情况下,你下一步的地方也是你来自哪里.通常你可以根据你知道你下一步去哪里来推断出你来自哪里的事实经常是有用的,但是你不能依赖它.允许调用堆栈包含足够的信息来确定下一步的位置; 它可以丢弃不必要的每一点信息,以确定你下一步的去向.

第三,你似乎是常见但错误的信念,即调用堆栈是确定你下一步的唯一系统,因此,你来自哪里.他们不是.正如我们将在下一版本的C#和VB中看到的那样,异步控制完全离开"你来自哪里"离开"你下一步的地方"而根本不使用调用堆栈.

也许你可以告诉我们你为什么要这些信息.可能有更好的方法来做你想要的.

  • @Yochai:我向你保证,通话栈不会*告诉你你来自哪里.它是告诉你下一步的去向.考虑例如尾递归方法.此外,您似乎相信多线程和异步在某种程度上是相关的.异步的要点是*消除*多线程.无论如何,每个线程的调用堆栈数量是无关紧要的. (2认同)