什么时候处置物体? C#

时间:2018-12-25 13:20:32

标签: c# image for-loop bitmap dispose

我写了一个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();
}

2 个答案:

答案 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 明确地。请注意,在someCondition2someCondition3的情况下,您提供的 代码摘录都将导致资源泄漏

如果要在嵌套循环中声明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的所有引用,以便垃圾收集器可以   回收图像占用的内存。