在方法作用域结束之前,我是否真的需要处理掉我的对象?

3
我从我的代码分析中得到了一个CA2000错误,要求我在退出作用域之前处理掉对象

在方法'MyMethod(Guid?)'中,在所有引用它的对象都超出作用域之前,调用System.IDisposable.Dispose来释放'person'对象。

我对这个规则感到惊讶,因为我认为当退出作用域时,处理程序会自动运行。注意:类似的问题已经被问过,并确认了我的观点,不要强制执行处理程序。
如果我不处理对象并且不使用using语句,会发生什么?

你从哪里得到那个引用的?如果没有上下文,它似乎没有什么意义;只需将你的方法包装在一个 using 语句中即可。 - Robert Harvey
发布你的代码。仅使用 using 将调用 dispose - Miserable Variable
是的,Person类实现了IDisposable接口。但是如果我不编写using语句或者手动调用dispose方法,那么我的对象会永远存在于内存中吗? - Bastien Vandamme
1
为什么“当然”。它里面有什么东西确实需要处理吗?Dispose方法不会自动调用。唯一自动调用的是终结器(如果已实现),并且通常会调用Dispose方法。但只有在GC开始收集时才会自动调用 - 这可能在应用程序生命周期内从未发生或经常发生。 - igrimpe
@MiserableVariable:实际上,只要实现了 IDisposable 接口的类就可以随时调用 dispose 方法。使用 using 语句是最好的选择,但如果由于某种原因有人不想利用编译器的魔力,他们可以简单地使用 try{...}finally{//Dispose}...这就是 using 语句编译成的代码。 - myermian
显示剩余2条评论
4个回答

4

Dispose不会自动调用。您必须显式调用它,或使用“using”关键字。 如果您不处理对象,则可能会由垃圾收集器完成,但仅在实现了正确的模式时才会这样做。


3
如果您已将对象包装在using语句中,则可以放心使用,因为它将被转换为。
try{
    var myObject = new MyObject();
}finally{
    myObject.Dispose();
} 

更新

如果您不处理对象,它可能会永久地驻留在内存中并保留附加资源。但也可能不是这样。这取决于垃圾回收器何时尝试清除它。但请注意,GC只能清除托管资源

请查看类似的问题:如果我不调用Pen对象上的Dispose方法会发生什么?


2
我以为退出作用域时,自动运行dispose方法。
不是所有的作用域,只有在using块作用域中才会自动运行。退出一个方法并不等同于退出一个using块。
如果一个对象实现了IDisposable接口,那么你应该手动或通过使用using块来释放它。根据你代码的结构,你可以自行决定何时执行释放操作。

1

对象超出范围时未调用Dispose。在许多情况下,当实现终结器并在其中调用Dispose时,垃圾回收对象时将调用它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接