c#.net中CLR销毁对象的机制

c#.net中CLR销毁对象的机制,c#,memory-management,resources,clr,using-statement,C#,Memory Management,Resources,Clr,Using Statement,我们可以声明析构函数,但不知道它何时运行,因为何时销毁不再被任何类型变量引用的对象是由CLR决定的。CLR通过使用垃圾收集器来决定它,垃圾收集器为所有可访问对象构建映射,并取消分配不可访问对象(没有引用的对象) 这里很明显,我们永远不能用自己的c#代码破坏一个对象 现在 当我们使用using语句(不使用指令)时,如下所示 using(ManageMe manage = new ManageMe()) { manage.Add(4,8);

我们可以声明析构函数,但不知道它何时运行,因为何时销毁不再被任何类型变量引用的对象是由CLR决定的。CLR通过使用垃圾收集器来决定它,垃圾收集器为所有可访问对象构建映射,并取消分配不可访问对象(没有引用的对象)

这里很明显,我们永远不能用自己的c#代码破坏一个对象

现在

当我们使用using语句(不使用指令)时,如下所示

using(ManageMe manage = new ManageMe())
        {
            manage.Add(4,8);
            Console.WriteLine("using statement executed");
        }
Q1:在使用语句结束后,manage(类型变量)引用的对象会发生什么情况?是指它已销毁还是CLR决定在需要时销毁

问题2:在我的程序执行期间,我们如何检查没有被任何类型变量引用的对象是否被破坏

Q1:管理(类型)引用的对象会发生什么情况 变量)在使用语句结束后?意思是它被销毁了还是被清除了 决定在需要时销毁

无论局部方法引用发生什么情况,它都会发生

问题2:我们如何检查未被引用的对象 在执行my期间,任何类型变量都会被销毁或不被销毁 节目

我将用一个新的问题来回答这个问题:如果您不拥有整个引用,您如何根据任何条件检查引用?除非没有指向该给定对象的引用,否则对象将存在于内存中。否则,垃圾收集器将在CLR自动触发后立即收集垃圾。换句话说:如果您的程序没有对对象的引用,您可以确保该对象将被垃圾收集

也就是说,垃圾收集器可能会收集实现
IDisposable
的对象,它将能够回收其内存,但整个对象所需和使用的底层资源将仍然有效,因为垃圾收集器不会为您调用
IDisposable.Dispose

您的问题是:IDisposable模式与垃圾收集无关
IDisposable
接口与垃圾收集无关。它只是一个定义能够释放资源的对象的接口。这些资源可以是:

  • 文件系统锁
  • TCP端口
  • 数据库连接
通常,
IDisposable
是由处理非托管资源的类实现的,因为它们是非托管的,所以需要手动处置它们。否则,它们将由垃圾收集器(当然是处理托管资源的)释放

另一方面,
使用
语句只是一种
最后尝试
简化:

using(ManageMe manage = new ManageMe())
{
     manage.Add(4,8);
     Console.WriteLine("using statement executed");
}
…是:

ManageMe manage = new ManageMe();
try 
{
     manage.Add(4,8);
     Console.WriteLine("using statement executed");
}
finally 
{
    manage.Dispose();
}
因此,正如我在回答您的Q1时所说,使用
块的
只是语法上的糖分,以确保
IDisposable.Dispose
方法在块结束后将被调用。
using
块需要一个
IDisposable
,它可以是
IDisposable
本身的变量声明:

ManageMe me = new ManageMe();
using(me) 
{

}