如何知道谁摧毁了一个物体?

时间:2011-07-27 13:57:30

标签: c# reflection destructor

我试图了解一个重要对象在哪里得到他的析构函数。 我做了一个明确的,以便记录导致它的堆栈跟踪。

但是new StackFrame(1).GetMethod().Name;会抛出一个NullReferenceException,我不确定我是否可以使用该方法,因为析构函数(~MyClass(){})没有被应用程序明确调用(无论如何,我认为你不能)。

有没有办法知道导致物体毁坏的堆栈跟踪?

谢谢!

2 个答案:

答案 0 :(得分:4)

你的问题毫无意义 托管对象永远不会被明确破坏。

相反,垃圾收集器将在最后一次引用它之后的某个时间收集每个对象 如果对象具有终结器,则GC将在GC线程上运行它,然后再收集对象。

答案 1 :(得分:3)

终结器(这是你正在编写的,它们不是析构函数,即使它们可能使用与C ++中的析构函数相同的语法)也会在垃圾收集器拥有的线程上调用。堆栈跟踪中没有任何内容与您相关,即使您可以获得它。

通常无法知道哪些事件会导致对象的破坏,因为对象破坏在.NET中是不确定的。 GC偶尔会检查哪些对象仍然可以访问。任何无法访问的对象都会释放其内存。无处跟踪对象的最后一次实时引用是什么。