必须在C#中手动清理的资源?

Gar*_*hby 11 c# resources garbage-collection memory-management

必须在C#中手动清理哪些资源,以及不这样做的后果是什么?

例如,假设我有以下代码:

myBrush = new System.Drawing.SolidBrush(System.Drawing.Color.Black);
// Use Brush
Run Code Online (Sandbox Code Playgroud)

如果我不使用dispose方法清理画笔,我假设垃圾收集器释放程序终止时使用的内存?它是否正确?

我需要手动清理哪些其他资源?

Ori*_*ian 7

  • 处理内部窗口数据结构.
  • 数据库连接.
  • 文件句柄.
  • 网络连接.
  • COM/OLE引用.

名单还在继续.

Dispose使用该using模式调用甚至更好是很重要的.

using (SolidBrush myBrush = new System.Drawing.SolidBrush(System.Drawing.Color.Black))
{
    // use myBrush
}
Run Code Online (Sandbox Code Playgroud)

如果你不处理某些东西,当垃圾收集器注意到没有更多的引用时,它会被清理掉,这可能需要一段时间.

在这种情况下System.Drawing.Brush,Windows将保持内存的窗口结构加载到内存中,直到所有程序释放其句柄.


Kho*_*oth 7

如果你没有处理某些东西,当垃圾收集器注意到你的代码中没有更多的引用时,它会被清理掉,这可能需要一段时间.对于类似的东西,它并不重要,但对于一个打开的文件它可能会.

一般来说,如果某个东西有Dispose方法,你应该在完成它之后调用它,或者,如果可以的话,将它包装在一个using语句中:

using (SolidBrush myBrush = new System.Drawing.SolidBrush(System.Drawing.Color.Black))
{
    // use myBrush
}
Run Code Online (Sandbox Code Playgroud)


Eri*_*bia 1

从技术上讲,任何继承自 IDisposable 的内容都应该主动处置。您可以使用“using”语句使事情变得更容易。

http://msdn.microsoft.com/en-us/library/yh598w02.aspx

有时,您会在文档示例代码以及工具(即 Visual Studio)生成的代码中看到 IDisposable 派生对象的使用不一致。

IDisposable 的优点在于它使您能够主动释放底层非托管资源。有时您确实想这样做 - 例如考虑网络连接和文件资源。