在此 c# EF 方案中,我是否需要担心垃圾回收
本文关键字:担心 是否 EF 方案 在此 | 更新日期: 2023-09-27 18:34:34
try
{
using (MapDataContainer ent = new MapDataContainer()) //is an autogen'd EF object
{
//do some stuff, assume it throws an error
}
}
catch(Exception ex) //catching outside using not sure if IDispose called
{
//handle error
}
通常我知道在EF对象上调用IDispose的使用。 所以假设它抛出了一个例外...这是可能的内存泄漏情况吗?
你很好。"使用"实际上是一种尝试。终于变相了。
using
语句实际上是
ResourceType resource = expression;
try {
statement;
}
finally {
if (resource != null) ((IDisposable)resource).Dispose();
}
如您所见,始终调用Dispose
。唯一的例外是如果是CLR错误,但在这种情况下,无论如何你都不走运。
正如 MSDN 所说,使用 语句由 C# 编译器转换为 try-finally 块以确保调用 IDisposable.Dispose((:
{
MapDataContainer ent = new MapDataContainer();
try
{
...
}
finally
{
if (ent != null)
((IDisposable)ent).Dispose();
}
}
唯一不调用 IDisposable.Dispose(( 的情况是使用语句块在内部调用 Environment.FailFast,或者在 MapDataContainer(( 的构造函数内部或之后抛出异常,但这仍然不会阻止垃圾收集器收集此对象。此外,实现 IDisposable 的对象通常(但不一定(在析构函数中调用 IDisposable.Dispose((,以确保即使在程序员忘记手动调用它或将其包装在 using 语句中,也可以正确释放任何非托管资源。