ID在 C# 中是可用的

本文关键字:ID | 更新日期: 2023-09-27 18:37:21

我编码如下:

class myclass : IDisposable
{
    public int a;
    public void Dispose()
    {
        GC.SuppressFinalize(this);
    }
}
class Program
{
    static void Main(string[] args)
    {
        myclass cl = null;
        using (myclass n = new myclass())
        {
            n.a = 10;
            cl = n;
        }
        int a = cl.a;// statement 1
    }
}

我希望语句 1 不起作用,因为 cl 对象已被释放(n 个对象已释放)。但它有效。那么 n 个对象真的在语句 1 中被释放了吗?

ID在 C# 中是可用的

无法显式"释放"托管对象。

Dispose()是一个完全普通的函数,旨在释放非托管资源。
调用它根本不影响 GC。

.NET 中的垃圾回收器可确保只要存在对它们的任何类型的引用,对象就会继续存在(即使对于弱引用之类的内容也是如此;如果对对象的唯一引用是弱引用,系统将使它们失效;此时,将没有任何引用该对象,它将不复存在)。

Dispose的目的是将一个可能可用的对象更改为一个不再有任何外部实体代表它做事而可能损害其他实体(例如,授予它对文件的独占访问权限,使该文件对其他人无法访问)的对象,该对象不再有任何外部实体代表它做任何事情, 通知所有此类实体不再需要其"服务"。 如果外部实体停止执行这些服务,则需要外部实体服务的对象通常会变得不可用,但处置的对象变得不可用的事实不是 Dispose 的目的,而只是一个常见的结果

属性a是托管资源。IDisposable 是用于处理非托管代码或资源的接口。

也许你期待这个物体被摧毁?这与处置不同。

相关文章:
  • 没有找到相关文章