Класс C #: ведение журнала / ведение домашнего хозяйства, я должен использовать деструктор? - PullRequest
2 голосов
/ 28 июля 2011

У меня есть класс AC #.Когда этот класс больше не используется, я хочу сделать кое-что.Например, зарегистрируйте текущее состояние и т. Д.

Я хочу быть уверен, что этот метод запускается каждый раз, когда класс больше не используется.Я не хочу просто использовать простой метод, потому что не могу быть уверен, что каждый пользователь вызывает его.

У меня нет ресурсов (например, файловых дескрипторов) для очистки.

Естьлучший способ использовать деструктор?

"не используется" - это когда (например):

  • пользователь использует мой класс в форме, а форма закрывается
  • класс используется в приложении, и это приложение закрыто

Ответы [ 3 ]

2 голосов
/ 28 июля 2011

Это зависит. C # .NET использует сборщик мусора, который неявно очищает объекты для вас. Обычно вы не можете контролировать очистку объектов - это делает сборщик мусора. Вы можете реализовать деструктор в своем классе, если хотите, но вы можете получить удар по производительности. MSDN имеет это сказать на деструкторов :

В общем, C # не требует столько памяти, сколько необходимо когда вы разрабатываете с языком, который не ориентирован на среду выполнения с вывоз мусора. Это потому что .NET Framework мусор Коллектор неявно управляет выделением и освобождением памяти для ваши объекты. Тем не менее, когда ваше приложение инкапсулирует неуправляемые ресурсы, такие как окна, файлы и сетевые подключения, вы должны использовать деструкторы, чтобы освободить эти ресурсы. Когда объект имеет право для уничтожения сборщик мусора запускает метод Finalize объект.

и, наконец, по производительности:

Когда класс содержит деструктор, запись создается в Завершить очередь. Когда вызывается деструктор, сборщик мусора вызывается для обработки очереди. Если деструктор пуст, это просто вызывает ненужную потерю производительности.

Существуют и другие способы управления ресурсами, кроме деструктора:

Очистка неуправляемых ресурсов

Реализация метода утилизации

с использованием Statement (C # Reference)

2 голосов
/ 28 июля 2011

Нет, это не лучший способ, деструктор дорог.

Лучшим способом было бы добавить метод Close () или, возможно, метод Dispose() (интерфейс IDiposable).

Но вам нужно очень тщательно определить, что означает "больше не используется", и если вы хотите, чтобы дополнительные проблемы решались и отслеживались.

Вы можете использовать деструктор для его автоматизации, но было бы лучше сделать это условным (только для отладочной конфигурации). Также учтите, что деструктор реализует «недетерминированную» финализацию.

0 голосов
/ 28 июля 2011

Если вы хотите, чтобы что-то запускалось, когда это сделано, вы должны реализовать IDisposable.

...