2

假设我有一个public static Rectangle DrawRectangle(Vector origin, Vector size)返回类型对象的方法Rectangle : IDisposable

如果我只调用方法DrawRectangle(origin, size),但不将返回值分配给变量myRectangle = DrawRectangle(origin, size),编译器会自动检测并调用DrawRectangle(origin, size).Dispose(),还是我必须自己做?

4

5 回答 5

3

没有意义。

最终他完成了,但没有。它不会自动调用 Dispose。

于 2013-01-07T09:27:03.237 回答
3

如果您的Rectangle班级实现IDisposable了,请在可能的情况下尝试该using( ) { ... }声明。

链接

于 2013-01-07T09:28:42.533 回答
2

编译器将代码构建到程序集中并且不负责任何执行。.net 运行时运行您的代码,更具体地说,垃圾收集器处理内存清理。在 using 块内调用实现 IDisposable 的对象通常是最佳实践。例如:

使用 (var obj = new object) { ... 做你的事情 }

这将帮助运行时了解您的对象何时超出范围并提前清理它,但只要您不保留对对象的引用,运行时最终会清理它并为您处理它。

于 2013-01-07T09:33:48.963 回答
1

如果您希望 CLR 调用 Dispose 方法,通常建议在您的类中实现所谓的Dispose 模式。但是,我不会依赖 CLR,也不会等待 GC 收集对象并改用using子句。

于 2013-01-07T09:33:30.933 回答
1

我只能想到编译器自动调用 dispose 的两种情况;最明显的是:

using(var obj = ... )
{
  // some code
}

这是一个明确的指令,说“最后,无论成功还是失败,如果obj非空,则调用obj.Dispose()”。基本上它扩展为:

{
   var obj = ...
   try {
       // some code
   } finally {
       if(obj != null) obj.Dispose();   
   }
}

另一个是foreach, where-by 迭代器被处理 - 虽然它变得有点复杂,因为IEnumerator没有指定这IDisposable是必需的(相比之下,IEnumerator<T> 确实指定了),并且在技术上IEnumerable甚至不需要foreach,但基本上:

foreach(var item in sequence) {
   // some code
}

可以表示为(尽管规范可能会略有不同):

{
    var iter = sequence.GetEnumerator();
    using(iter as IDisposable)
    {
        while(iter.MoveNext())
        {   // note that before C# 5, "item" is declared *outside* the while
            var item = iter.Current;
            // some code
        }
    }
}

在所有其他情况下,处置资源是您的责任。

如果你不确保它Dispose()被调用,那么在 GC 最终收集对象之前什么都不会发生;如果有一个终结器(不一定有,通常也没有),将调用终结器 - 但这与Dispose(). 它可能(取决于每种类型的实现)最终会做与Dispose(): 相同的事情,但可能不会。

于 2013-01-07T09:38:35.573 回答