Изображение сразу создается в выражении? - PullRequest
2 голосов
/ 15 ноября 2011

Достаточно ли этого:

    using (Graphics g = Graphics.FromImage(image))
    {
        g.DrawImage(newImage.GetThumbnailImage(10, 10, null, new IntPtr()), 3, 3, 10, 10);
    }

Или я должен использовать:

  using (Graphics g = Graphics.FromImage(image))
        {
            using (Image i = newImage.GetThumbnailImage(10, 10, null, new IntPtr()))
            {
                g.DrawImage(i, 3, 3, 10, 10);
            }
        }

РЕДАКТИРОВАТЬ: Может кто-нибудь добавить ссылку на MS, что даже когда переменная не создана - ресурсыне освободится сразу?

Ответы [ 3 ]

2 голосов
/ 15 ноября 2011

Вы должны использовать оператор using для типов, которые реализуют IDisposable.В противном случае ресурсы не будут освобождены до тех пор, пока объект не будет завершен.

Чтобы сделать код немного лучше, мне нравится складывать using блоков

  using (Graphics g = Graphics.FromImage(image))
  using (Image i = newImage.GetThumbnailImage(10, 10, null, new IntPtr()))
  {
      g.DrawImage(i, 3, 3, 10, 10);
  }
2 голосов
/ 15 ноября 2011

Он не будет утилизирован, если вы специально не вызовете для него метод Dispose() (или он не покинет блок using). Так что в вашем случае использование второго блока using было бы более безопасным, чтобы обеспечить освобождение неуправляемых ресурсов.

1 голос
/ 15 ноября 2011

Мало того, что сборщик мусора не сработает сразу, но он может не очистить объекты правильно, если они содержат системные ресурсы - как файлы.Хотя я не уверен насчет класса Image, но, тем не менее, если ваш код должен (когда-нибудь) работать в тесной памяти, вы хотите, чтобы изображение было очищено немедленно, когда вы закончите с ним.Вот где приходят using и IDisposable.

Однажды я нашел очень хороший блог об использовании блока здесь , следующий код:

using (MyClass myClass = GetMyClass())
{
    myClass.DoSomething();
}

ведут себя точно так:

MyClass myClass = GetMyClass();
try
{
    myClass.DoSomething();
}
finally
{
    IDisposable disposable = myClass as IDisposable;
    if (disposable != null) disposable.Dispose();
}

Таким образом, он очистит ваш образ, даже если ваш код сгенерирует исключение, и не вызовет никаких проблем, если вы позвоните утилизировать себя.используйте использование с объектами, которые реализуют IDisposable, кроме того, если код сложный, вызовите Dispose себя, как только вам больше не нужен объект - и установите для ссылки на объект значение null.

...