当你有这样的代码时:
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 怎么样?
我的主要问题是,如果这些要手动处理,为什么不在它们超出范围后立即处理?如果您不手动处理它们,会发生这种情况吗?是延迟让人们手动执行此操作吗?
最佳答案
是的,您必须处理它们 - 不仅是笔和画笔,还有 Bitmap
和 Graphics
。
当它们超出范围时,它们不会被释放,因为变量本身是引用,而不是对象,并且 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
范围(无论是正常情况下,通过控制转移例如 return
或 break
,或异常)。
如果您有 C++ 背景,在 C# 中使用 using
直接类似于 const std::auto_ptr
,除了它在这里是一种语言构造,并且只能用于局部变量(即不用于类字段)。
关于c# - 什么时候需要 Dispose?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1209585/