C# 如何知道谁破坏了一个物体?

C# 如何知道谁破坏了一个物体?,c#,reflection,destructor,C#,Reflection,Destructor,我想知道一个重要物体的析构函数是从哪里来的。 我做了一个显式的,为了记录导致它的stacktrace 但是newstackframe(1).GetMethod().Name抛出一个NullReferenceException,我不确定是否可以使用这种方法,因为应用程序没有显式调用析构函数(~MyClass(){}) 有没有办法知道导致物体毁灭的痕迹 谢谢>终结器(这是你正在编写的,它们不是析构函数,即使它们可能使用与C++中的析构函数相同的语法)在垃圾回收器拥有的线程上调用。堆栈跟踪中没有与您相

我想知道一个重要物体的析构函数是从哪里来的。 我做了一个显式的,为了记录导致它的stacktrace

但是
newstackframe(1).GetMethod().Name
抛出一个
NullReferenceException
,我不确定是否可以使用这种方法,因为应用程序没有显式调用析构函数(
~MyClass(){}

有没有办法知道导致物体毁灭的痕迹

谢谢

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


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

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

相反,垃圾收集器将在释放对每个对象的最后一次引用后的某个时间收集该对象。

如果对象有终结器,GC将在收集对象之前在GC线程上运行它。

终结器线程只会调用析构函数,并且只会在对对象的所有引用消失后调用析构函数。你得到的答案总是一样的(“哦,这是终结器线程”),我只是说我没有调用任何Dispose()方法,因此我没有“明确地”调用任何终结器/析构函数,但我想知道是谁做的。狒狒:正如SLaks和@Damien所说,“谁”是GC。你的问题的答案是“不”