C# 为什么列表会打断添加到其中的位图?

C# 为什么列表会打断添加到其中的位图?,c#,asp.net,list,bitmap,C#,Asp.net,List,Bitmap,当添加到列表中时,位图基本上被删除。 我做错了什么 处理位图是否会破坏添加到列表中的位图 List<Bitmap> _list = new List<Bitmap>(); public void MyMethod() { using (var _bitmap = new Bitmap(1920, 1080)) { _list.Add(_bitmap); } } List _List=newlist(); 公共方法() { 使用(

当添加到列表中时,位图基本上被删除。 我做错了什么

处理位图是否会破坏添加到列表中的位图

List<Bitmap> _list = new List<Bitmap>();

public void MyMethod()
{
    using (var _bitmap = new Bitmap(1920, 1080))
    {
        _list.Add(_bitmap);
    }
}
List _List=newlist();
公共方法()
{
使用(var_位图=新位图(19201080))
{
_列表。添加(_位图);
}
}
我将断点放在行
\u列表中。添加(\u位图),这是添加前的位图:

当它在列表中时:

这是你的台词

using (var _bitmap = new Bitmap(1920, 1080))
{
    _list.Add(_bitmap);
} //_bitmap  is destroyed here
Bitmal
派生自实现
IDisposable
的类,因此在闭包结束时,
Dispose
将在
Bitmap
上调用

在这种情况下,您可能希望避免使用

值得一提的是,
\u list.Add(..)
添加了对已创建位图实例的引用,而不复制/克隆它

这是你的台词

using (var _bitmap = new Bitmap(1920, 1080))
{
    _list.Add(_bitmap);
} //_bitmap  is destroyed here
Bitmal
派生自实现
IDisposable
的类,因此在闭包结束时,
Dispose
将在
Bitmap
上调用

在这种情况下,您可能希望避免使用

值得一提的是,
\u list.Add(..)
添加了对已创建位图实例的引用,而不复制/克隆它

处理位图是否会破坏添加到列表中的位图

List<Bitmap> _list = new List<Bitmap>();

public void MyMethod()
{
    using (var _bitmap = new Bitmap(1920, 1080))
    {
        _list.Add(_bitmap);
    }
}
当然有。列表中没有任何位图,它只有指向位图的指针(即指向存储每个位图的内存地址的指针)。因此,一旦您处理位图,指针现在将指向一个空的内存地址

如果要从需要释放的文件或其他资源创建位图,请在创建位图后克隆位图,处理原始位图(您已经使用
using()
语句执行了此操作),然后将克隆添加到列表中:

using (var _bitmap = new Bitmap("flower.png")) {
    Bitmap clone = Bitmap(_bitmap);
    _list.Add(clone);
}
处理位图是否会破坏添加到列表中的位图

List<Bitmap> _list = new List<Bitmap>();

public void MyMethod()
{
    using (var _bitmap = new Bitmap(1920, 1080))
    {
        _list.Add(_bitmap);
    }
}
当然有。列表中没有任何位图,它只有指向位图的指针(即指向存储每个位图的内存地址的指针)。因此,一旦您处理位图,指针现在将指向一个空的内存地址

如果要从需要释放的文件或其他资源创建位图,请在创建位图后克隆位图,处理原始位图(您已经使用
using()
语句执行了此操作),然后将克隆添加到列表中:

using (var _bitmap = new Bitmap("flower.png")) {
    Bitmap clone = Bitmap(_bitmap);
    _list.Add(clone);
}

当您使用
作用域退出
时,将位图添加到列表后,您正在销毁该位图。@aseemrakaranwal:“所有非基本数据类型的对象都是通过引用传递的”-不,它们不是。
\u bitmap
的值实际上是一个引用,但该引用通过值传递给
Add
方法。请看@AseemRajBaranwal以强调Jon Skeet的观点。这不仅仅是关于位图,事实上,与您的语句完全相反的是正确的:几乎所有内容都是按值传递的。非基本数据类型的对象也按值传递,但它们本身就是引用。所以引用是按值传递的。@JonSkeet感谢您的精确说明!今天学到了一些基本的东西。@AseemRajBaranwal:Hooray-感谢您以建设性的精神接受我的评论,这是有意的:)当您使用
范围退出
时,将位图添加到列表中,您正在销毁位图。@AseemRajBaranwal:“所有非原始数据类型的对象都是通过引用传递的”-不,它们不是。
\u bitmap
的值实际上是一个引用,但该引用通过值传递给
Add
方法。请看@AseemRajBaranwal以强调Jon Skeet的观点。这不仅仅是关于位图,事实上,与您的语句完全相反的是正确的:几乎所有内容都是按值传递的。非基本数据类型的对象也按值传递,但它们本身就是引用。所以引用是按值传递的。@JonSkeet感谢您的精确说明!今天学到了一些基本的东西。@AseemRajBaranwal:Hooray-感谢您以建设性的精神接受我的评论:)为了完整起见,可能值得表示,向列表中添加一个对象并不会创建一个新对象,因为这似乎是提问者假设的(或者他们没有意识到为什么using语句如此受欢迎)。@HDL_CinC_Dragon我对此不确定,感谢您的澄清。为了完整起见,可能值得一提的是,向列表中添加一个对象并不会创建一个新对象,这似乎是询问者所假设的(或者他们不知道为什么using语句如此受欢迎)。@HDL_CinC_Dragon我不确定,谢谢你的澄清。