在退出我的方法范围之前,我应该真正处理我的对象吗?

时间:2012-12-13 15:31:46

标签: c# .net

我的代码分析出现 CA2000 错误,要求我在退出范围之前处理我的对象

  

在丢失范围之前处理对象在方法中   'MyMethod(Guid?)',来电   System.IDisposable.Dispose在对象'person'之前所有引用   它超出了范围。

我对此规则感到惊讶,因为我认为在退出示波器时会自动运行dispose。注意:A similar question已被询问并确认我的意见,不强制处置程序。

如果我不处理我的对象并且我没有在使用指令中使用它会发生什么?

4 个答案:

答案 0 :(得分:3)

永远不会自动调用Dispose。您必须明确地调用它,或使用'using'关键字 至少,如果你不处理你的对象,它可能由垃圾收集器完成,但只有你实现了正确的patern。

答案 1 :(得分:2)

如果您已将对象包装在using语句中,那么您可以将其翻译为。

try{
    var myObject = new MyObject();
}finally{
    myObject.Dispose();
} 

更新

如果你没有处置你的对象,'可能永远留在内存中保留附加的资源。但可能不会。它依赖于垃圾收集器来试图清除它。但要注意GC 只能清除托管资源

点击此处查看类似问题:What happens if I don't call Dispose on the pen object?

答案 2 :(得分:2)

  

我认为在退出示波器时会自动运行dispose。

不是任何范围,只有using块范围。退出方法与退出using块不同。

如果某个对象实现了IDisposable,那么您应该始终手动或通过using块进行处理。根据您的代码结构,由您决定何时执行此操作。

答案 3 :(得分:1)

当对象超出范围时,不调用Dispose。在许多场景中,当垃圾收集对象时(当实现在其中调用Finalizer和Dispose时)将调用它。