簡體   English   中英

繼承對象的靜態方法

[英]Static Method on object inheriting Disposable

我最近繼承了一個運行於內存泄漏中的asp.net項目。 在我的調查中,我注意到有很多實現IDisposable的自定義類,但是它們在調用時並沒有使用“ using”。 我一直在解決這些問題,但是我很好奇的一個用例是將靜態方法放在類上。 像這樣:

public class ImDisposable : IDisposable{
   public static GetList(string search){
       //doStuff
   }
   //implement IDisposable
}

public class UseDisposable{
   public void GetList(string search){
      var list = ImDisposable.GetList(search);
      //do stuff
   }
}

我從未見過這樣的事情,我很好奇GC如何處理這種情況。 謝謝。

靜態方法不依賴於任何特定實例,因此它們不應訪問類的實例成員,這些實例成員可能占用非托管資源。

在考慮處理資源時,您無需考慮它們


與此相關的是,方法的存在也與IDisposable無關。 它本身不處理“方法”,而是處理該類實例可能使用的非托管資源。 (例如打開的文件流)

您可能會混淆內存泄漏和垃圾回收……只是因為您沒有調用Dispose()並不意味着您將發生泄漏。 在以下情況下會泄漏:

(1)您未處理的類具有非托管資源(例如文件流)的句柄。 從理論上講,如果一個類實現了IDisposable,則它具有不受管理的資源,但是我已經看到了我厭煩的足夠的空處理方法。 IE的靜態類/成員,除非您有需要處理的靜態變量,否則不是內存泄漏。

同樣,靜態成員將永遠只有一個實例,而不管您實例化了多少個類,並且當從未創建任何新實例時,您就不會真正泄漏。

(2)在不需要/意​​味着不需要時,您保留對象引用。一個很好的例子是事件偵聽器,尤其是那些作為lambda連接的偵聽器。 即使Dispose()只是將連接返回到連接池,也沒有在數據庫連接上調用Dispose()也被視為泄漏。

還請記住,不斷增加的內存占用並不一定是泄漏。 僅當.NET運行時認為有必要時才執行垃圾回收...如果仍然有足夠的可用內存,則無需GC。

高度簡化的概述; 我主要是說沒有static與您的內存泄漏有關。 有一個關於牽制內存泄漏的好文章在這里

您的問題有點含糊。

您可能會看到Richter通過C#編寫的CLR書,以獲取有關垃圾回收的解釋。 雖然我的感覺是您的問題更多是關於非靜態類中的靜態方法與垃圾回收器之間的交互。 上述書也涵蓋了這一點。 通常,分配資源的靜態方法的行為方式類似於分配資源的非靜態方法。 但是,IDisposable接口將在該類的實例上運行。 因此,您的靜態GetList(..)方法不應使用需要IDisposable實現釋放的資源。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM