Графика, утилизировать перед повторным использованием?

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

графика = "создатьГрафика"

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

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

                        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();
                        };

Итак, это в цикле while, до этого я заставляю gmp наследовать панель. Но я никогда не выбрасываю его в цикле, я просто постоянно использую его повторно, за исключением случаев, когда размеры не совпадают.

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

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

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

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

Спасибо


person Zerowalker    schedule 17.08.2013    source источник
comment
Вы должны всегда удалять объекты, содержащие собственные ресурсы. Graphics, Socketс, что угодно.   -  person Simon Whitehead    schedule 17.08.2013
comment
Если класс реализует интерфейс IDisposable, вы можете быть уверены, что для этого есть причина. C# позволяет вам не заботиться о GC, но это хорошая практика, особенно при создании объектов в цикле.   -  person Tarec    schedule 17.08.2013


Ответы (2)


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

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

против

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

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

person Andrew Sun    schedule 17.08.2013
comment
Да, точно. И да, я избавлюсь от него, когда закончу с ним. но я должен утилизировать его там или что? то же самое с TCPClient, я не знаю, должен ли я .Close before = new TCPClient(). - person Zerowalker; 17.08.2013
comment
Да, вы должны избавиться от него, прежде чем присваивать ему новое значение. - person Andrew Sun; 17.08.2013
comment
Отлично, и почему это так, было бы неплохо узнать, почему я не должен назначать перед удалением, поскольку я назначаю его прямо в следующей строке :) - person Zerowalker; 17.08.2013
comment
Если вы не вызовете для него Dispose, объект Graphics какое-то время будет удерживать свои ресурсы (пока не появится сборщик мусора). Это означает, что ваше приложение будет использовать больше памяти, чем требуется. Если вы создаете только один или два объекта Graphics, вы можете этого не заметить, но если вы вызываете CreateGraphics слишком много раз, использование памяти может стать заметным. - person Andrew Sun; 21.08.2013

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

person supercat    schedule 18.08.2013