繁体   English   中英

在这个c#EF场景中我是否需要担心垃圾收集?

[英]Do I have to worry about garbage collection in this c# EF scenario?

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所说, using语句由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语句中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM