我写了一个for
循环,在其中声明了一个新的Image
,所以每次在内部Dispose
循环中都应该for
,或者一旦全部完成,有什么区别?
这是一个使事情变得清晰的例子, 我应该使用这个吗?
for (int i = 0; i < 10; i++)
{
Image imgInput = new Image();
for (int j = 0; j < 100; j++)
{
// Here is a code to use my image
Image.Dispose();
}
}
或:
for (int i = 0; i < 10; i++)
{
Image imgInput = new Image();
for (int j = 0; j < 100; j++)
{
// Here is a code to use my image
}
Image.Dispose();
}
答案 0 :(得分:6)
我们通常将 IDisposable
包装到using
中,以便保证该实例(即非托管资源)将被丢弃雨或阳光。如果要声明内部循环的Image
外部:
for (int i = 0; i < 10; i++)
{
using (Image imgInput = new Image())
{
for (int j = 0; j < 100; j++)
{
...
// In all these cases the resource will be correctly released:
if (someCondition1)
break;
...
if (someCondition2)
return;
...
if (someCondition3)
throw new SomeException(...);
...
// Here is a code to use my image
}
}
}
这就是为什么我们不应该呼叫Dispose
明确地。请注意,在someCondition2
或someCondition3
的情况下,您提供的 代码摘录都将导致资源泄漏。
如果要在嵌套循环中声明Image
,则采用相同的方案:
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 100; j++)
{
using (Image imgInput = new Image())
{
// Here is a code to use my image
}
}
}
答案 1 :(得分:2)
如果不调用dispose方法,则析构函数(finalizer)负责释放资源。 GC仅清除托管资源。调用Bitmap.Dispose可以确保及时清理这些非托管资源,并且不会泄漏资源。
通常情况下,如果析构函数超出范围,则将调用析构函数。
在释放最后一个引用之前,请始终致电Dispose。 图片。否则,它所使用的资源将在以下情况下释放: 垃圾收集器调用Image对象的Finalize方法。
您的第二种方法很有意义。使用图像对象后,您将dispose。
for (int i=0;i<10;i++)
{
Image imgInput = new Image();
for (int j=0;j<100;j++)
{
//Here is a code to use my image
}
Image.Dispose();
}
使用完图像后,请致电Dispose。处置方法 使图像保持不可用状态。致电Dispose之后,您必须 释放对Image的所有引用,以便垃圾收集器可以 回收图像占用的内存。