Как вызвать деструктор в C # XNA - PullRequest
6 голосов
/ 07 июня 2011

У меня есть объект, и я просто хочу уничтожить его на каком-нибудь событии.Как вызвать деструктор в XNA?

Ответы [ 7 ]

6 голосов
/ 07 июня 2011

Установите объект на null, и сборщик мусора поднимет его при следующем запуске.

В качестве примечания: если вы часто создаете объект (враги, пули и т. Д.), Вы можете использовать пул вместо удаления объекта. Это будет означать, что объект перерабатывается, и, следовательно, сборщик мусора вызывается реже, что повышает производительность.

3 голосов
/ 07 июня 2011

Хотя ваш пробег может отличаться, я предпочитаю использовать IDisposable и Dispose() объектов, которые мне больше не нужны. Это особенно. Значение true, если вы используете неуправляемые ресурсы, но настройка Dispose() объявляет намерение.

См. Этот ресурс на GC.SuppressFinalize для хорошего примера того, как реализовать IDisposable.

http://msdn.microsoft.com/en-us/library/system.gc.suppressfinalize.aspx

1 голос
/ 07 июня 2011

Установить ссылку на этот объект на null.

0 голосов
/ 07 июня 2011

Что вы хотите сделать, это позвонить по номеру GC.SuppressFinalize(), если вы сами выполняете очистку ... Обычно вы используете GC.SuppressFinalize() в классе IDisposable. См. Этот пример кода для общего использования IDisposable:

http://msdn.microsoft.com/en-us/library/system.gc.suppressfinalize.aspx

Если вам действительно нужно собрать мусор прямо сейчас:

var myObj = new MyObject();

// This object will be cleaned up by the Dispose method.
// Therefore, you should call GC.SupressFinalize to
// take this object off the finalization queue 
// and prevent finalization code for this object
// from executing a second time.
GC.SuppressFinalize(myObj);

Но я предупреждаю вас, что вы действительно должны позволить объекту выйти из области видимости и позволить GC собирать объекты естественным образом. Среда выполнения .NET очень эффективна для управления памятью, если вы не пытаетесь ее выполнять.

EDIT

После просмотра комментариев я вижу, что вы забыли оставить важную часть информации, поскольку вы связывали рассматриваемый объект с другими методами объектов. Это означает, что объект, который вы пытаетесь завершить, не будет завершен до тех пор, пока не будет завершен метод, используемый для наблюдения за событием, таким образом сохраняя в памяти около тонны дополнительных объектов.

Что вы можете сделать, чтобы разорвать эту сильную ссылку, это использовать объект с именем WeakReference. Или используйте лямбды, чтобы сломать сильные ссылки.

См. Пример использования WeakReference. http://msdn.microsoft.com/en-us/library/system.weakreference.aspx

Или вы можете сделать что-то вроде этого:

dym.cas += (x, y, z) => gameTime.ElapsedGameTime(x,y,z);

вместо

dym.cas += gameTime.ElapsedGameTime;
0 голосов
/ 07 июня 2011

Если объект содержит какие-либо неуправляемые ресурсы, тогда реализуйте IDisposable (и используйте using или вызовите Dispose(), когда закончите с ним).

Если он не содержит неуправляемые ресурсы, сборщик мусора будет запрашивать его «в определенный момент», когда на него больше не будет ссылок.

GC.Collect () соберет сборщик мусора и "уничтожит" ваш объект, если на него нет ссылок. Это не очень хорошая идея, поскольку она влияет на производительность (требуется время и превращает другие объекты в более высокое поколение, заставляя их дольше сохраняться в памяти перед тем, как их восстановить).

Зачем вам уничтожать объект в определенное фиксированное время?

0 голосов
/ 07 июня 2011

Что за объект? Если это Disposable / IDisposable, вы должны вызвать object.Dispose () В противном случае вы можете просто использовать object = null, и он будет «очищен» автоматически. Это не C, в котором вы работаете;)

Если ваш «объект» на самом деле является сложным классом или чем-то с большим количеством объектов в нем, вы можете рассмотреть возможность сделать его классом IDisposable.

0 голосов
/ 07 июня 2011

После установки объекта на null, если вы хотите по какой-то причине немедленно собрать объект, вызовите GC.Collect().

...