C# 对象实例失去引用时如何处理

C# 对象实例失去引用时如何处理,c#,object,reference,destructor,C#,Object,Reference,Destructor,使用C 我有一门美孚课程: class MainFoo { private Foo foo; public MainFoo() { this.foo = new Foo(); } public CreateNewFoo() { this.foo = new Foo(); } public DoCurrentFoo() { this.foo.Do(); } }

使用C

我有一门美孚课程:

class MainFoo
{
    private Foo foo;

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

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

    public DoCurrentFoo()
    {
        this.foo.Do();
    }
}
class Foo
{
    ~Foo()
    {
        this.DoEnd();
    }

    public void Do() {}

    private void DoEnd() {}
}
Foo类:

class MainFoo
{
    private Foo foo;

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

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

    public DoCurrentFoo()
    {
        this.foo.Do();
    }
}
class Foo
{
    ~Foo()
    {
        this.DoEnd();
    }

    public void Do() {}

    private void DoEnd() {}
}
我希望能够调用Foo类中的DoEnd方法,无论何时私有Foo;get再次初始化。这个方法DoEnd是私有的,我希望保持这种方式,这样就不能从MainFoo访问它

由于同一个Foo-get再次初始化,我认为该实例将失去其引用,因此它将调用析构函数。但只有当MainFoo实例丢失引用时,才会调用此函数

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

你不能,这是用户的工作

发件人:

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

你不能,这是警察的工作

发件人:

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


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

最方便的是,这可以通过使用…{}来完成

回到您的示例,您还可以按照Jason Watkins的建议在属性分配时处理对象,但请确保它不会在其他任何地方使用

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

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

最方便的是,这可以通过使用…{}来完成

回到您的示例,您还可以按照Jason Watkins的建议在属性分配时处理对象,但请确保它不会在其他任何地方使用

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