在此 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的使用。 所以假设它抛出了一个例外...这是可能的内存泄漏情况吗?

在此 c# EF 方案中,我是否需要担心垃圾回收

你很好。"使用"实际上是一种尝试。终于变相了。

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 语句中,也可以正确释放任何非托管资源。