You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何添加至List的Bitmap会损坏?Dispose操作是否影响列表对象?

问题根源与解决办法

兄弟,你这个问题的核心原因其实很简单——你用using包裹了Bitmap的创建,导致添加到列表后它直接被释放了。

咱们先理清楚using的作用:它是C#里用来自动释放非托管资源的语法糖,当using代码块执行结束时,会自动调用对象的Dispose()方法,把Bitmap底层的图像数据从内存里清掉。你把_bitmap添加到_list后,using块就结束了,这时候_bitmap对应的资源已经被回收,而列表里存的只是这个Bitmap对象的引用,指向的是已经没有数据的空壳,自然就显示“损坏”了。

至于你问的“调用Dispose是否会破坏列表中的Bitmap”——答案是肯定的。因为列表里存的不是Bitmap的副本,而是对象的引用,Dispose释放的是这个对象本身的资源,所以列表里的引用对应的对象也会变成无效状态。

给你两个解决思路:

  • 思路一:移除using,手动管理Dispose时机
    既然你需要把Bitmap存在列表里长期使用,就不要用using包裹它的创建,等到你真正不再需要整个列表的时候,再遍历列表逐个调用Dispose()释放资源:

    List<Bitmap> _list = new List<Bitmap>();
    public void MyMethod()
    {
        var _bitmap = new Bitmap(1920, 1080);
        _list.Add(_bitmap);
    }
    
    // 当你不再需要列表里的Bitmap时,调用这个方法清理
    public void CleanupBitmaps()
    {
        foreach (var bmp in _list)
        {
            bmp.Dispose();
        }
        _list.Clear();
    }
    
  • 思路二:添加Bitmap的副本到列表
    如果你因为某些原因必须保留using(虽然这个场景下没必要),可以创建一个Bitmap的副本添加到列表,这样using释放的是原对象,列表里的副本还能正常使用:

    List<Bitmap> _list = new List<Bitmap>();
    public void MyMethod()
    {
        using (var _bitmap = new Bitmap(1920, 1080))
        {
            // 创建原Bitmap的副本
            var bitmapCopy = new Bitmap(_bitmap);
            _list.Add(bitmapCopy);
        }
    }
    

    不过要注意,这种方式会占用双倍内存,后续也别忘了给副本调用Dispose()。

内容的提问来源于stack exchange,提问作者To Mi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:33:40