【问题标题】:How to Dispose Object instance when it lost it's reference丢失引用时如何处理对象实例
【发布时间】:2013-03-22 18:06:22
【问题描述】:

使用 C#。

我有一个 MainFoo 类:

class MainFoo
{
    private Foo foo;

    public MainFoo()
    {
        this.foo = new Foo();
    }  

    public CreateNewFoo()
    {
        this.foo = new Foo();
    }

    public DoCurrentFoo()
    {
        this.foo.Do();
    }
}

一个 Foo 类:

class Foo
{
    ~Foo()
    {
        this.DoEnd();
    }

    public void Do() {}

    private void DoEnd() {}
}

我希望能够在 private Foo; 再次初始化时调用 in Foo 类的方法 DoEnd()。这个方法DoEnd() 是私有的,我想保持这种方式(所以不能从MainFoo 访问)

由于同一个 Foo get 再次被初始化,我虽然实例会失去它的引用,所以它会调用析构函数。但是只有在 MainFoo 实例丢失引用时才会调用它。

问题:对象实例失去引用时如何处理?

【问题讨论】:

    标签: c# object reference destructor


    【解决方案1】:

    不保证在任何特定时间调用析构函数,甚至根本不被调用。通常,您不应依赖析构函数,而应实现 IDisposable 并自己调用 Dispose。

    最方便的是,这可以通过using(...){ } 完成。

    回到您的示例,您还可以在分配属性时处置对象(如 Jason Watkins 建议的那样),但请确保它没有在其他任何地方使用。

    public Foo F
    {
        get{return foo;}
        set
        {
            if( foo != null)
                foo.Dispose();
            foo = value;
         }
    }
    

    【讨论】:

      【解决方案2】:

      你不能,这是Garbage Collector的工作。

      来自MSDN

      在 C# 中,垃圾收集由公共语言运行时 (CLR) 处理,具有与 JVM 类似的功能。 CLR 垃圾收集器定期检查内存堆中是否有任何未引用的对象,并释放这些对象持有的资源。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-25
        相关资源
        最近更新 更多