Как вы управляете детерминированной финализацией в С#?

У меня есть объект С# с критическим ресурсом, который необходимо очистить очень конкретными моментами времени, что делает его плохим кандидатом, чтобы уйти от сборщика мусора, чтобы он заботился о каждом случае, когда он обходит его, как мне обращаться с этим? Есть ли что-то вроде оператора С++ 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(), но это НЕ хорошая вещь, но действительный ответ на вопрос!