代码之家  ›  专栏  ›  技术社区  ›  Matt Hamsmith Rahul Singh

当对象不在.NET范围内时,代码是否可以运行?

  •  5
  • Matt Hamsmith Rahul Singh  · 技术社区  · 15 年前

    当变量在.NET语言中失去作用域时,是否有任何方法可以“自动”运行终结/析构函数代码?在我看来,由于垃圾收集器在不确定的时间运行,所以在变量失去作用域时不会立即运行析构函数代码。我意识到我可以从IDISPIDLE继承,并明确地调用Debug在我的对象上,但是我希望可以有一个更省时的解决方案,类似于非.NETC++处理对象破坏的方式。

    期望行为(c):

    public class A {
        ~A { [some code I would like to run] }
    }
    
    public void SomeFreeFunction() {
        SomeFreeSubFunction();
        // At this point, I would like my destructor code to have already run.
    }
    
    public void SomeFreeSubFunction() {
        A myA = new A();
    }
    

    不太理想的:

    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();
        }
    }
    
    3 回复  |  直到 15 年前
        1
  •  9
  •   Philippe Leybaert    15 年前

    using结构最接近您想要的:

    using (MyClass o = new MyClass()) 
    {
     ...
    }
    

    即使发生异常,也会自动调用Dispose()。但是您的类必须实现IDisposable。

    但这并不意味着物体从记忆中被移除。你无法控制。

        2
  •  4
  •   Coincoin    15 年前

    实现IDisposable的对象的using关键字就是这样做的。

    例如:

    using(FileStream stream = new FileStream("string", FileMode.Open))
    {
        // Some code
    }
    

    它被编译器替换为:

    FileStream stream = new FileStream("string", FileMode.Open);
    try
    {
        // Some code
    }
    finally
    {
        stream.Dispose();
    }
    
        3
  •  3
  •   Lasse V. Karlsen    15 年前

    不幸的是,没有。

    你最好的选择是实施 IDisposable IDisposable pattern .