当对象超出.Net中的作用域时,是否可以运行代码?

当对象超出.Net中的作用域时,是否可以运行代码?,.net,finalizer,.net,Finalizer,在.Net语言中,一旦变量失去作用域,有没有办法“自动”运行终结/析构函数代码?在我看来,由于垃圾收集器在不确定的时间运行,所以只要变量失去作用域,析构函数代码就不会运行。我意识到我可以从IDISPITLE继承,并明确地调用Debug在我的对象上,但是我希望有一个更为省时的解决方案,类似于非.NETC++处理对象破坏的方式。 期望的行为(C#): 不太可取的: public class A : IDisposable { [ destructor code, Dispose method

在.Net语言中,一旦变量失去作用域,有没有办法“自动”运行终结/析构函数代码?在我看来,由于垃圾收集器在不确定的时间运行,所以只要变量失去作用域,析构函数代码就不会运行。我意识到我可以从IDISPITLE继承,并明确地调用Debug在我的对象上,但是我希望有一个更为省时的解决方案,类似于非.NETC++处理对象破坏的方式。 期望的行为(C#):

不太可取的:

public class A : IDisposable {
    [ destructor code, Dispose method, etc. etc.]
}

public void SomeFreeFunction() {
    SomeFreeSubFunction();
}

public void SomeFreeSubFunction() {
    A myA = new A();
    try {
        ...
    }
    finally {
        myA.Dispose();
    }
}

将关键字与实现IDisposable的对象一起使用就可以做到这一点

例如:

using(FileStream stream = new FileStream("string", FileMode.Open))
{
    // Some code
}
这将由编译器替换为:

FileStream stream = new FileStream("string", FileMode.Open);
try
{
    // Some code
}
finally
{
    stream.Dispose();
}

使用构造最接近您想要的:

using (MyClass o = new MyClass()) 
{
 ...
}
即使发生异常,也会自动调用Dispose()。但是您的类必须实现IDisposable

但这并不意味着该对象已从内存中删除。你无法控制它。

不幸的是,没有

最好的选择是使用。

(+1)实现。值得注意的是,“使用”是使用Dispose方法的缩写,而不是使用析构函数和从内存中删除对象。另请参见
using (MyClass o = new MyClass()) 
{
 ...
}