什么时候处理对象? C#
When to dispose objects? C#
我写了一个 for
-loop,我在里面声明了一个新的 Image
,所以我每次在内部 for
-loop 里面都应该 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();
}
}
或:
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();
}
我们通常将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
的情况下,您提供的 both 代码摘录将导致 资源泄漏 .
如果您想在 嵌套循环中声明 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
}
}
}
如果您不调用 dispose 方法,析构函数(终结器)将负责释放资源。 GC 只清理托管资源。调用 Bitmap.Dispose 可以确保及时清理这些非托管资源并且不会泄漏资源。
通常在您的情况下,如果析构函数超出范围,将调用它。
Always call Dispose before you release your last reference to the
Image. Otherwise, the resources it is using will not be freed until
the garbage collector calls the Image object's Finalize method.
你的第二种方法很有道理。使用图像对象后,您将 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();
}
Call Dispose when you are finished using the Image. The Dispose method
leaves the Image in an unusable state. After calling Dispose, you must
release all references to the Image so the garbage collector can
reclaim the memory that the Image was occupying.
我写了一个 for
-loop,我在里面声明了一个新的 Image
,所以我每次在内部 for
-loop 里面都应该 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();
}
}
或:
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();
}
我们通常将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
的情况下,您提供的 both 代码摘录将导致 资源泄漏 .
如果您想在 嵌套循环中声明 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
}
}
}
如果您不调用 dispose 方法,析构函数(终结器)将负责释放资源。 GC 只清理托管资源。调用 Bitmap.Dispose 可以确保及时清理这些非托管资源并且不会泄漏资源。
通常在您的情况下,如果析构函数超出范围,将调用它。
Always call Dispose before you release your last reference to the Image. Otherwise, the resources it is using will not be freed until the garbage collector calls the Image object's Finalize method.
你的第二种方法很有道理。使用图像对象后,您将 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();
}
Call Dispose when you are finished using the Image. The Dispose method leaves the Image in an unusable state. After calling Dispose, you must release all references to the Image so the garbage collector can reclaim the memory that the Image was occupying.