У меня есть объект C# с критическим ресурсом, который должен быть очищен очень конкретными точками во времени, что делает его плохим кандидатом, чтобы оставить вокруг сборщика мусора, чтобы заботиться о том, когда он обходит его, как я должен справиться с этим? Есть что-то вроде оператора удаления C++, который позволит мне вручную убить экземпляр этого объекта, когда это необходимо?Как вы управляете детерминированной финализацией в C#?
ответ
Это именно то, для чего нужен интерфейс IDiposable
. Вы освобождаете критические ресурсы в методе Dispose()
, а затем оставляете объект вокруг для удаления мусора, чтобы иметь дело с освобождением памяти.
Google для интерфейса IDisposable. Это единственный доступный вам механизм. Это сделано специально, если ваш критический ресурс неуправляем. Если это управляемый ресурс, вы можете быть более конкретным о том, что нужно «покраснет».
Интерфейс IDisposable был добавлен для поддержки детерминированного уничтожения в C++/CLI, и вы можете использовать его с любого языка .NET. Это то, что вы хотите.
Если вы говорите об определенном управляемом ресурсе, который вы считаете «ДОЛЖНЫ» освобождаться в определенное время, вы можете указать метод сбора коллекционеров мусора после удаления ссылки на объект, но есть соображения производительности для как обычно, сборщик мусора знает, когда собирать предметы. И вообще это плохая идея.
Как упоминалось выше, шаблон IDisposable полезен для освобождения неуправляемых ресурсов, когда это необходимо.
ПРИМЕЧАНИЕ: Я собираюсь повторить, вы МОЖЕТЕ вызвать GC.Collect(), но это НЕ хорошая вещь, но действительный ответ на вопрос!
Интерфейс IDisposable существует для детерминированного уничтожения. Существует шаблон для его правильной реализации на MSDN.
В тандеме также следует рассмотреть возможность использования using statement, если срок службы вашего объекта не охватывает несколько областей.
Вы ищете IDisposable
. Вот примерный класс, который реализует это.
class MyDisposableObject : IDisposable
{
public MyDisposableObject()
{
}
~MyDisposableObject()
{
Dispose(false);
}
private bool disposed;
private void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
// Dispose of your managed resources here.
}
// Dispose of your unmanaged resources here.
this.disposed = true;
}
}
void IDisposable.Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
Чтобы использовать его, вы можете сделать что-то вроде этого:
public void DoingMyThing()
{
using (MyDisposableObject obj = new MyDisposableObject())
{
// Use obj here.
}
}
using
ключевое слово убеждается, что Dispose()
метод на IDisposable
вызывается в конце его объема.
- 1. Интервьюер: «Как вы управляете зависимостями?»
- 2. Как вы управляете SQL-запросами
- 3. Как вы управляете установкой Eclipse?
- 4. Как вы управляете библиотеками зависимостей?
- 5. Как вы управляете библиотеками three.js?
- 6. Как вы управляете графом объектов в Haskell?
- 7. Как вы управляете версиями и управляете несколькими ветвями базы данных?
- 8. Как вы управляете tabindex в широкомасштабном приложении?
- 9. Как вы управляете порядком стрельбы в asp.net?
- 10. Как вы управляете версиями зависимостей, в nodejs?
- 11. Как вы управляете пространством имен в Meteor?
- 12. Как вы управляете списком кортежей в SML?
- 13. Как вы управляете архитектурой в гибком проекте?
- 14. Как вы управляете версиями в Workflow Foundation?
- 15. Как вы управляете зависимостями в библиотеках Javascript
- 16. Как вы управляете режимом совместимости в HTML
- 17. Вы активно управляете техническим долгом?
- 18. Как вы управляете своим кодом DojoX?
- 19. Как вы помните/управляете своими примерами SQL?
- 20. Как вы управляете веб-разработчиками удаленно?
- 21. Как вы управляете временем жизни сервера Rook?
- 22. Как вы управляете своими файлами Javascript?
- 23. Как вы управляете крупным портфелем продуктов?
- 24. Как вы управляете растущими конфигурациями eclipse?
- 25. Как вы управляете файлами JAR от Hibernate?
- 26. Java Как вы управляете слоями при рисовании?
- 27. Как вы управляете несколькими проектами ReactJS?
- 28. Как вы управляете u-макетом приложения Ember.js?
- 29. Как вы управляете эффективностью ведения журнала?
- 30. Как вы управляете своими настраиваемыми модулями?
Не вызывайте GC.Collect(). Плохая привычка вступать и, как правило, более вредна, чем полезно. – Will 2008-10-09 18:27:49