簡體   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