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我不确定,谢谢你的澄清。