Когда распоряжаться объектами?C # - PullRequest
0 голосов
/ 25 декабря 2018

Я написал 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 голосов
/ 25 декабря 2018

Если вы не вызываете свой метод dispose, деструктор (финализатор) отвечает за освобождение ресурсов.GC только очищает управляемые ресурсы.Вызов Bitmap.Dispose позволяет вам гарантировать своевременную очистку этих неуправляемых ресурсов и отсутствие утечек ресурсов.

Обычно в вашем случае вызывается деструктор, если он выходит из области видимости..

Всегда вызывайте Dispose, прежде чем выпускать свою последнюю ссылку на изображение.В противном случае используемые им ресурсы не будут освобождены, пока сборщик мусора не вызовет метод Finalize объекта Image.

Ваш второй метод имеет смысл.Вы утилизируете после использования объекта изображения.

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 оставляет изображение в непригодном для использования состоянии.После вызова метода Dispose вы должны освободить все ссылки на изображение, чтобы сборщик мусора мог восстановить память, которую занимал образ.

0 голосов
/ 25 декабря 2018

Мы обычно переносим 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
        }        
    }     
}
...