我从阅读MSDN文档中了解到,IDisposable接口的"主要"用途是清理非托管资源.
对我来说,"非托管"意味着数据库连接,套接字,窗口句柄等等.但是,我已经看到了Dispose()实现该方法以释放托管资源的代码,这对我来说似乎是多余的,因为垃圾收集器应该照顾那对你而言.
例如:
public class MyCollection : IDisposable
{
private List<String> _theList = new List<String>();
private Dictionary<String, Point> _theDict = new Dictionary<String, Point>();
// Die, clear it up! (free unmanaged resources)
public void Dispose()
{
_theList.clear();
_theDict.clear();
_theList = null;
_theDict = null;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,这是否使得垃圾收集器可以使用的内存MyCollection比通常更快?
编辑:到目前为止,人们已经发布了一些使用IDisposable清理非托管资源(例如数据库连接和位图)的好例子.但是假设_theList在上面的代码中包含了一百万个字符串,并且你想现在释放那个内存,而不是等待垃圾收集器.上面的代码会实现吗?
我有许多类具有实现IDisposable(定时器,画笔等)的私有成员变量.我是否需要做任何事情以确保.NET Framework正确清理这些变量?
我遇到的文献是指"托管资源"与"非托管资源".这些术语让我感到困惑,因为您可以拥有一个使用非托管资源实现功能的托管类.这被认为是"非托管资源"还是"托管资源"?
我的理解是,如果您没有在实现IDisposable的对象上调用Dispose(),那么在应用程序退出之前不会释放资源.在长时间运行程序时,这种情况可能会导致OutOfMemory异常.
如何确保我的代码正确处理资源管理?这对于这些对象很重要,因为它们是自定义控件,并且可能有很多绘图消耗了IDisposable资源.我尽可能使用C#using语句,但有时我需要使一个对象实现IDisposable成员变量,而using语句对我没有帮助.
我有一个表单,在我的构造函数中创建了一些我需要处理的可支配资源.但是,C#表单设计器已在Designer.cs文件中生成一个Dispose()方法,该方法似乎没有任何类型的用户挂钩.所以我不知道我应该如何实现典型IDisposable模式.
偶尔会创建此表单但从未显示过,因此使用Close事件无济于事.
有问题的对象不是IComponents,所以我不能只是添加它们this.components.
我在哪里可以放置这个清理代码,并确保它在表单处理时运行?
在Visual Studio中似乎存在视觉(?)错误。当我打开网站文件夹作为网站并查看Views.ascx.designer.cs时,它并不表明它已关联。但是,如果我打开同一网站的解决方案文件,则这些文件已关联,一切都很好。
需要明确的是,即使它仍然显示以下错误消息,它仍在工作,我认为将其作为网站而不是作为解决方案来打开是一个错误。
在我的实时网站上,我遇到了一个错误:

但是它应该存在,因为我在Views.ascx.designer.cs中拥有它:

但是在Visual Studio中,我的Views.ascx.designer.cs未与我的View.ascx关联:

我试图将.designer文件拖放到View.ascx上,但它显示以下错误消息:

它可以正常工作,在我的开发服务器上看起来也很好:

我不确定如何将文件与View.ascx或View.ascx.cs文件关联起来。