1

使用 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() {}
}

我希望能够在get 再次初始化时调用DoEnd() Foo类中的方法。private Foo;此方法DoEnd()是私有的,我想保持这种方式(因此无法从 访问MainFoo

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

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

4

2 回答 2

6

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

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

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

public Foo F
{
    get{return foo;}
    set
    {
        if( foo != null)
            foo.Dispose();
        foo = value;
     }
}
于 2013-04-01T16:33:11.900 回答
0

你不能,这是垃圾收集器的工作。

来自MSDN

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

于 2013-04-01T16:32:36.070 回答