本帖最后由 getstr88 于 2022-6-25 22:29 编辑
下面代码,form载入时,load一张图片,然后让picbox1和2都显示它,点击button1,我以为的应该是这样的,因为还有picbox2引用这个image,所以不会disposed,等于不执行(而表现上,确实picbox1仍旧显示这个图片)
然后点击button2,是将image赋值给picbox3,我本以为这应该是没有问题的。因为我觉得反正image并没有被释放。但实际却报错了。报 System.ArgumentException:“Parameter is not valid.”
这我就有点不理解了。我打断点跟踪,发现整个过程,image指向内存地址也没有变动(在vs的即时视图中,用&_Image不断观察变化)
那出现这个的原因是什么呢? (我这个例子只是为了搞清楚原理,故意造的一个例子。请对C#内存机制熟悉的大佬指点一二。如果只是和我一样,一直用其他编程语言,只不过因为工作需要,临时抱佛脚突击学一下C#,只会点皮毛的朋友,就不要像我这样瞎猜了)
[C#] 纯文本查看 复制代码 public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Image _Image;
private void Form1_Load(object sender, EventArgs e)
{
_Image = LoadImageFile(@"d:\1.tif");
pictureBox1.Image = _Image;
pictureBox2.Image = _Image;
}
public static Image LoadImageFile(string filePath)
{
FileStream fileStream = new FileStream(filePath, FileMode.Open);
MemoryStream memoryStream = new MemoryStream();
fileStream.CopyTo(memoryStream);
Image image = Image.FromStream(memoryStream);
fileStream.Close();
return image;
}
private void button1_Click(object sender, EventArgs e)
{
pictureBox1.Image.Dispose();
}
private void button2_Click(object sender, EventArgs e)
{
pictureBox3.Image = _Image;
}
}
|