释放引用对象的问题 本帖最后由 jshzp 于 2011-04-28 12:17:42 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 直接re掉,做了3年,还没发现这个bufferimage.Dispose();方法有什么实际效用 re掉不就不会有warning咯// bufferimage.Dispose();// sBP.Dispose();微软那个warning是说,如果写这两行代码在这里,有可能会提前释放掉,frmM.BackgroundImage就会变成空,没有图片了 1、frmM.BackgroundImage = bufferimage;2、bufferimage.Dispose();3、sBP.Dispose();frmM.backgroundImage 和 bufferimage 引用的是同一个东西bufferimage.Dispose()了,frmM.backgroundImage 也释放资源了 可能出现意外结果这种情况下 我觉得就想楼上所说的 不用Dispose了吧 不过我碰到一种情况 必须Dispose掉当你想通过Image.FromFile()来给PictureBox.Image赋值时 不能直接用完就了事像这样Image image=Image.FromFile(path);Picture1.Image=image;这样之后,程序中如果要用到 path 指定的那个图片文件时 总是提示文件正在使用 所以这种情况应该将Image Dispose掉像这样: Image image = Image.FromFile(path); Image bmp = new Bitmap(image); image.Dispose(); pictureBox1.Image = bmp;楼主那种情况 也涉及到文件 你可以试一下 不Dispose的话 能否同时在其他地方使用(移动或者删除什么的)dir.ToString() + @"\" + ImgInfo[imgIndex].Name这个文件 感谢xiaozhi_5638的讨论。刚才一高手指点我应该使用using语句隐式地释放该对象,我把代码改成下面的方式:[code=C#]try { int imgIndex = ra.Next(ImgInfo.Length); using (Bitmap bufferimage = new Bitmap(frmM.Width, frmM.Height)) { Bitmap sBP = new Bitmap(dir.ToString() + @"\" + ImgInfo[imgIndex].Name); using (Graphics g = Graphics.FromImage(bufferimage)) { g.DrawImage(sBP, new Rectangle(0, 0, frmM.Width, frmM.Height), new Rectangle(0, 0, sBP.Width, sBP.Height), GraphicsUnit.Pixel); } frmM.BackgroundImage = bufferimage; sBP.Dispose(); } } catch { }code]再次运行代码分析后,果然排除了CA2000的警告。先前显式调用Dispose()方法不行,现在使用using语句隐式地调用(根据MSDN的解释,GC会在using语句结束时,回收在using中创建的对象)就行了。谁能告诉我其中的道理啊? 因为using块是语句块,块内变量生存期只在块内...显然你这些块内并不存在块外引用,所以不需要警告...跟你顶楼的描述并不是一回事... frmM.BackgroundImage = bufferimage;-----------------------没注意看...有一个块外引用,但是资源已经释放...能不能显示呢?没注意过... try { int imgIndex = ra.Next(ImgInfo.Length); using (Bitmap bufferimage = new Bitmap(frmM.Width, frmM.Height), sBP = new Bitmap(dir.ToString() + @"\" + ImgInfo[imgIndex].Name)) { using (Graphics g = Graphics.FromImage(bufferimage)) { g.DrawImage(sBP, new Rectangle(0, 0, frmM.Width, frmM.Height), new Rectangle(0, 0, sBP.Width, sBP.Height), GraphicsUnit.Pixel); } frmM.BackgroundImage = bufferimage; } } catch { }刚才C#代码显示不正常,现在重新贴一下,这样可能就容易看了PS:反映下,论坛中回复的帖子不能编辑,太不方便了!这么做是不是因小失大了呢? 其实只是csdn的人懒得加个编辑功能而已 嗯,这回可以正常显示了。可以看出,frmM.BackgroundImage = bufferimage;是在第一个using语句内部。我贴的是真实代码,实际上还有sBP、g对像,帖子中只是集中注意力讨论bufferimage对象,所以和第二个Using语句无关。 刚才睁大眼睛,仔细看了一下VS给出的CA2000警告,注意到其中一句话“请对该对象调用system.IDisposable.Dispose”,联想到system.IDisposable.Dispose方法好像是由垃圾回收器在对象作用期结束时自动调用的!也就是说VS认为这里只能由垃圾回收器自动回收对象,而不应该显式地调用Dispose()方法回收。如果我的这个理解是正确的,那么就能解释前面的问题了。希望高手予以签定! 当前上下文不存在名称“Html” 写XML文件的问题 字符串分割问题 格式化时间问题 超过8000字符的数据该使用什么类型???? c#操作sqlserver2000数据库,大侠进来看看,我需要你的帮助 该linq效率太低,是我写的不好吗? ????????手工向DataGrid控件中添加数据 简单的代码,复杂的问题,大家帮忙看看 求一条SQL语句 如何制作安装包 使用ORM的效率有多差
re掉不就不会有warning咯
// bufferimage.Dispose();
// sBP.Dispose();
微软那个warning是说,如果写这两行代码在这里,有可能会提前释放掉,frmM.BackgroundImage就会变成空,没有图片了
2、bufferimage.Dispose();
3、sBP.Dispose();frmM.backgroundImage 和 bufferimage 引用的是同一个东西
bufferimage.Dispose()了,frmM.backgroundImage 也释放资源了 可能出现意外结果这种情况下 我觉得就想楼上所说的 不用Dispose了吧 不过我碰到一种情况 必须Dispose掉当你想通过Image.FromFile()来给PictureBox.Image赋值时 不能直接用完就了事
像这样
Image image=Image.FromFile(path);
Picture1.Image=image;
这样之后,程序中如果要用到 path 指定的那个图片文件时 总是提示文件正在使用 所以这种情况应该将Image Dispose掉
像这样:
Image image = Image.FromFile(path);
Image bmp = new Bitmap(image);
image.Dispose();
pictureBox1.Image = bmp;楼主那种情况 也涉及到文件 你可以试一下 不Dispose的话 能否同时在其他地方使用(移动或者删除什么的)dir.ToString() + @"\" + ImgInfo[imgIndex].Name这个文件
刚才一高手指点我应该使用using语句隐式地释放该对象,我把代码改成下面的方式:
[code=C#]try
{
int imgIndex = ra.Next(ImgInfo.Length);
using (Bitmap bufferimage = new Bitmap(frmM.Width, frmM.Height))
{
Bitmap sBP = new Bitmap(dir.ToString() + @"\" + ImgInfo[imgIndex].Name);
using (Graphics g = Graphics.FromImage(bufferimage))
{
g.DrawImage(sBP, new Rectangle(0, 0, frmM.Width, frmM.Height), new Rectangle(0, 0, sBP.Width, sBP.Height), GraphicsUnit.Pixel);
}
frmM.BackgroundImage = bufferimage;
sBP.Dispose();
}
}
catch { }code]
再次运行代码分析后,果然排除了CA2000的警告。先前显式调用Dispose()方法不行,现在使用using语句隐式地调用(根据MSDN的解释,GC会在using语句结束时,回收在using中创建的对象)就行了。
谁能告诉我其中的道理啊?
-----------------------
没注意看...有一个块外引用,但是资源已经释放...能不能显示呢?没注意过...
{
int imgIndex = ra.Next(ImgInfo.Length);
using (Bitmap bufferimage = new Bitmap(frmM.Width, frmM.Height), sBP = new Bitmap(dir.ToString() + @"\" + ImgInfo[imgIndex].Name))
{
using (Graphics g = Graphics.FromImage(bufferimage))
{
g.DrawImage(sBP, new Rectangle(0, 0, frmM.Width, frmM.Height), new Rectangle(0, 0, sBP.Width, sBP.Height), GraphicsUnit.Pixel);
}
frmM.BackgroundImage = bufferimage;
}
}
catch { }
刚才C#代码显示不正常,现在重新贴一下,这样可能就容易看了
PS:反映下,论坛中回复的帖子不能编辑,太不方便了!这么做是不是因小失大了呢?
如果我的这个理解是正确的,那么就能解释前面的问题了。
希望高手予以签定!