Как вы управляете детерминированной финализацией в С#?
У меня есть объект С# с критическим ресурсом, который необходимо очистить очень конкретными моментами времени, что делает его плохим кандидатом, чтобы уйти от сборщика мусора, чтобы он заботился о каждом случае, когда он обходит его, как мне обращаться с этим? Есть ли что-то вроде оператора С++ delete, который позволит мне вручную убить экземпляр этого объекта, когда это необходимо?
Ответы
Ответ 1
Вы ищете 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
вызывается в конце своей области.
Ответ 2
Это именно то, для чего нужен IDiposable
. Вы отпустите критические ресурсы в методе Dispose()
, а затем оставьте объект вокруг для удаления мусора для устранения освобождения памяти.
Ответ 3
Интерфейс IDisposable существует для детерминированного уничтожения. Там шаблон для его правильной реализации на MSDN.
В тандеме вы также должны рассмотреть использование с использованием оператора, когда ваше время жизни объекта не охватывает несколько областей.
Ответ 4
Google для интерфейса IDisposable. Это единственный доступный вам механизм. Он создан, если ваш критический ресурс неуправляем. Если это управляемый ресурс, вы можете быть более конкретным о том, что нужно "покраснет".
Ответ 5
Интерфейс IDisposable был добавлен для поддержки детерминированного уничтожения в С++/CLI, и вы можете использовать его с любого языка .NET. Это то, что вы хотите.
Ответ 6
Если вы говорите об определенном управляемом ресурсе, который вы считаете "ДОЛЖНЫ" освобождаться в определенное время, вы можете явно вызвать метод сбора коллекционеров мусора после удаления ссылки на объект, но есть соображения производительности думал, как обычно сборщик мусора знает, когда собирать предметы. И вообще это плохая идея.
Как упоминалось выше, шаблон IDisposable полезен для освобождения неуправляемых ресурсов, когда это необходимо.
ПРИМЕЧАНИЕ: Я собираюсь повторить, вы МОЖЕТЕ вызвать GC.Collect(), но это НЕ хорошая вещь, но действительный ответ на вопрос!