我的代码分析中出现CA2000错误,要求我在退出范围之前处置我的对象
在失去范围之前处置对象在方法“MyMethod(Guid?)”中,在对对象“person”的所有引用超出范围之前调用 System.IDisposable.Dispose。
我对这条规则感到惊讶,因为我认为 dispose 在退出范围时会自动运行。注意: 已经提出了类似的问题,并确认我的意见是不要强制执行处置程序。
如果我不处置我的对象并且我不在 using 指令中使用它会发生什么?
我的代码分析中出现CA2000错误,要求我在退出范围之前处置我的对象
在失去范围之前处置对象在方法“MyMethod(Guid?)”中,在对对象“person”的所有引用超出范围之前调用 System.IDisposable.Dispose。
我对这条规则感到惊讶,因为我认为 dispose 在退出范围时会自动运行。注意: 已经提出了类似的问题,并确认我的意见是不要强制执行处置程序。
如果我不处置我的对象并且我不在 using 指令中使用它会发生什么?
Dispose 永远不会被自动调用。你必须显式调用它,或者使用'using'关键字至少,如果你不处理你的对象,它可能由垃圾收集器完成,但前提是你实现了正确的模式。
如果您已将对象包装在using
语句中,则可以,因为它将被翻译成。
try{
var myObject = new MyObject();
}finally{
myObject.Dispose();
}
更新
如果您不处置您的对象,它“可能永远留在内存中”保留附加的资源。但可能不会。当它试图清除它时,它取决于垃圾收集器。但要注意 GC只能清除托管资源。
在这里寻找类似的问题:如果我不在笔对象上调用 Dispose 会发生什么?
我认为 dispose 在退出范围时会自动运行。
没有任何作用域,只有using
块作用域。退出方法与退出using
块不同。
如果一个对象实现了IDisposable
,那么你应该总是手动或通过一个using
块来处理它。何时执行此操作取决于您的代码结构。
当对象超出范围时不调用 Dispose。在许多情况下,当垃圾收集对象时会调用它(当实现 Finalizer 并在其中调用 Dispose 时)。