对象继承Disposable的静态方法

时间:2017-11-07 17:12:01

标签: c# asp.net static garbage-collection

我最近继承了一个运行到内存泄漏的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如何处理这种情况。感谢。

3 个答案:

答案 0 :(得分:1)

静态方法不依赖于任何特定实例,因此他们不应该能够访问类中可能占用未管理资源的实例成员。

在考虑处置资源时,您无需考虑它们

在相关的说明中,方法的存在与IDisposable几乎没有关系。它没有处理"方法" per-se,它处理类的实例可能使用的非托管资源。 (例如打开文件流)

答案 1 :(得分:1)

你可能会混淆内存泄漏和垃圾收集......只是因为你没有打电话Dispose()并不意味着你会有泄漏。在以下情况下你会泄漏:

(1)您未配置的课程具有非托管资源的句柄,例如:一个文件流。从理论上讲,如果一个类实现了IDisposable,它有非托管资源,但是我已经看到了足够的空处理方法,而且我已经厌倦了。 I.E.对于静态类/成员,除非你有一个需要处理的静态变量,否则不是你的内存泄漏。

此外,静态成员只会拥有一个实例,无论您实例化多少个类,并且在没有创建新实例时您都无法实现泄漏。

(2)当你不需要/意​​味着......保持对象引用时,好的例子就是事件监听器,尤其是作为lambda连接的事件。不在数据库连接上调用Dispose()也被视为泄漏,即使Dispose()只是返回连接池的连接。

另请注意,不断增长的内存占用不一定是泄漏。垃圾收集仅在.NET运行时认为必要时执行...如果仍然有足够的可用内存,则不需要GC。

高度简化的概述;我大多说static没有与你的内存泄漏有关。关于确定内存泄漏问题的文章很好here

答案 2 :(得分:0)

你的问题有点模糊。

您可以通过C#by Richter看到有关垃圾收集的说明书CLR。虽然我的感觉是你的问题更多的是关于非静态类中的静态方法与垃圾收集器之间的交互。上述书也涵盖了这一点。 通常,分配资源的静态方法将以与分配资源的非静态方法类似的方式运行。但是,IDisposable接口将在类的实例上运行。所以,你的     静态GetList(..) 方法不应该使用需要IDisposable实现的资源来释放。