gpt4 book ai didi

c# - 什么时候需要 Dispose?

转载 作者:可可西里 更新时间:2023-11-01 08:02:49 25 4
gpt4 key购买 nike

当你有这样的代码时:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com