2013-08-17 2 views
1

Я хочу знать, должен ли я располагать объект Graphic перед его повторным использованием? смысл я заменить подмигнули значение:Графика, утилизируйте перед повторным использованием?

графический = «createGraphic»

что-то подобное, я должен располагать перед этим?

вот пример кода, где я использую его:

     gmp.DrawImage(newImage, 0, 0); 
         if (newImage.Size != panelm.Size) 
         { 
          panelm.Invoke((MethodInvoker)delegate { panelm.Size = newImage.Size; }); 
          this.Invoke((MethodInvoker)delegate { this.Size = newImage.Size; }); 
          gmp.Dispose(); 
          gmp = panelm.CreateGraphics(); 
         }; 

Таким образом, это в цикле в то время, прежде чем время, я сделать ГМП наследует panelm. Но, я никогда не избавляюсь от него в цикле, я просто повторно его использую все время, кроме того, если размеры не совпадают.

Тогда мне нужно его воссоздать (иначе это будет большой/маленький).

Но теперь дело в том, должен ли я распоряжаться раньше, или я должен просто использовать creategraphic?

Кроме того, проблема здесь. Я не могу использовать «Использование» на gmp. Потому что, если я это сделаю, у меня есть только 2 возможности.

1: создать его перед циклом while и повторно использовать его до тех пор, пока цикл while не закончится (это значит, я никогда не смогу его изменить). 2: создайте его внутри цикла while (это означает, что он будет воссоздан каждый цикл, который, я думаю, будет пустой тратой).

Благодаря

+0

Вы должны ** всегда ** удалять объекты, содержащие собственные ресурсы. 'Графика',' Socket', что угодно. –

+0

Если класс реализует интерфейс IDisposable, вы можете быть уверены, что для этого есть причина. C# позволяет вам не заботиться о GC, но это хорошая практика, особенно при создании объектов в цикле. – Tarec

ответ

1

Так вы спрашиваете, если вы должны позвонить Dispose() на него, прежде чем дать ему новое значение?

Graphics gmp = panelm.CreateGraphics(); 
//do work 
gmp.Dispose(); 
gmp = panelm.CreateGraphics(); 

против

Graphics gmp = panelm.CreateGraphics(); 
//do work 
gmp = panelm.CreateGraphics(); 

Как хорошая практика, вы должны вызвать Dispose(), когда вы сделали; хотя когда-нибудь он будет автоматически очищаться сборщиком мусора, если вы этого не сделаете, поэтому вы не будете утечки ресурсов в любом случае.

+0

Да точно. И да, я избавлюсь от него, когда покончу с этим. , но должен ли я распоряжаться им там или что? Это то же самое с TCPClient, я не знаю, должен ли я. Закройте before = new TCPClient(). – Zerowalker

+0

Да, вы должны избавиться от него, прежде чем назначать ему новое значение. –

+0

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

0

Переменные ссылочного типа не содержат объектов, но вместо этого идентифицируют их; может быть полезно подумать о них как об объектных идентификаторах. Если вызов CreateGraphics возвращает «Объект № 4872», то необходимо убедиться, что что-то вызовет Dispose на Объекте # 4872. Если someVariable имеет место «Объект № 4872», то сообщение someVariable.Dispose на самом деле ничего не сделает до someVariable, но вместо этого будет называть Dispose на объекте # 4872. Если бы код должен был перезаписать переменную перед вызовом Dispose, у нее не было бы способа узнать, какой объект должен иметь вызванный метод Dispose.