c# - 什么时候需要 Dispose?

标签 c# .net gdi+ dispose garbage-collection

当你有这样的代码时:

Bitmap bmp = new Bitmap ( 100, 100 );
Graphics g = Graphics.FromImage ( bmp );

Pen p = new Pen ( Color.FromArgb ( 128, Color.Blue ), 1 );
Brush b = new SolidBrush ( Color.FromArgb ( 128, Color.Blue ) );

g.FillEllipse ( b, 0, 0, 99, 99 );    
g.FillRegion ( b, pictureBox1.Region );

pictureBox1.BackColor = Color.Transparent;
pictureBox1.Image = bmp;

你必须处理笔和毛笔吗? bmp 和 g 怎么样?

我的主要问题是,如果这些要手动处理,为什么不在它们超出范围后立即处理?如果您不手动处理它们,会发生这种情况吗?是延迟让人们手动执行此操作吗?

最佳答案

是的,您必须处理它们 - 不仅是笔和画笔,还有 BitmapGraphics

当它们超出范围时,它们不会被释放,因为变量本身是引用,而不是对象,并且 C# 编译器不知道所有权是否仍然属于这些引用(例如 FillEllipse 理论上可以记住它给出的引用,并在稍后尝试使用它 - 请记住,语言编译器没有任何库语义的特殊知识!)。

如果您想表明所有权仅限于该范围,您可以使用 using 语句:

using (Bitmap bmp = new Bitmap ( 100, 100 ))
using (Graphics g = Graphics.FromImage ( bmp ))
using (Pen p = new Pen ( Color.FromArgb ( 128, Color.Blue ), 1 ))
using (Brush b = new SolidBrush ( Color.FromArgb ( 128, Color.Blue ) ))
{
    g.FillEllipse ( b, 0, 0, 99, 99 );    
    g.FillRegion ( b, pictureBox1.Region );
}

这将使编译器根据需要自动插入对 Dispose 的调用,确保一旦离开相应的 using 范围(无论是正常情况下,通过控制转移例如 returnbreak,或异常)。

如果您有 C++ 背景,在 C# 中使用 using 直接类似于 const std::auto_ptr,除了它在这里是一种语言构造,并且只能用于局部变量(即不用于类字段)。

关于c# - 什么时候需要 Dispose?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1209585/

相关文章:

c# - 如何使用 C# 获取 DDMMYY 格式的当前日期并将它们拆分为 DD、MM 和 YY?

c# - 使用参数从 Winform 应用程序调用 WPF 应用程序

c# - 如何在 C# 中按降序版本列表排序?

c# - 将字典属性作为对象访问

c# - 哪个是在 .Net2005 客户端-服务器应用程序中实现报告模块的更好方法? Crystal 报表或 SSRS

c# - Bitmap.Save "Exception (0x80004005): A generic error occurred in GDI+."上的 ASP.NET 错误

c# - 如何反序列化接口(interface)类型?

c# - 如何绑定(bind)多个下拉列表而不刷新?

C++ GDI+ 对象内存泄漏/对象太多?

c# - 如何使用 GDI+(C#、WinForms)绘制带有路径渐变的圆弧