【问题标题】:Am I responsible for Disposing a BackgroundImage?我负责处理 BackgroundImage 吗?
【发布时间】:2010-12-08 04:00:28
【问题描述】:

我有一个 Windows 窗体,我将 BackgroundImage 属性设置为自定义位图图像。

私人图像 MakeCustomBackground() { 位图结果 = 新位图 (100, 100); 使用(图形画布 = Graphics.FromImage(结果)) { // 绘制自定义图像 } 返回结果; } 私人无效UpdateFromBackground() { this.BackgroundImage = MakeCustomBackground(); }

我的问题是,图像是一次性的,我正在创建它,这是否意味着我必须处理它?或者当我通过 BackgroundImage 将图像传递给表单时,它是否会取得所有权并在不再需要它时将其丢弃?

【问题讨论】:

    标签: c# .net winforms dispose idisposable


    【解决方案1】:

    假设UpdateFromBackground() 被多次调用,您可能应该在设置新图像时(之前)处理图像。如果你不这样做,那么 GC 最终会这样做,但效率较低。该表单只会处理您分配的最后一个 BgImage。

    private void UpdateFromBackground()
    {
        if (this.BackgroundImage != null)
        {
           this.BackgroundImage.Dispose();
        }
        this.BackgroundImage = MakeCustomBackground();
    }
    

    【讨论】:

    • 一旦你覆盖了 BackgroundImage 属性,假设没有其他对 Image 实例的引用,GC 最终会像 Henk 所说的那样处理它。我想强调的是,控件没有明确处理该实例,因此最好自己处理它。您可以使用两个不同的变量 imageA 和 imageB 对此进行测试,每个变量都设置为不同的 Image 实例。将 BackgroundImage 设置为 imageA,然后设置为 imageB,然后测试 imageA 是否已被释放 - 你会发现它没有被释放。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多