Как вы управляете детерминированной финализацией в C #? - PullRequest
8 голосов
/ 09 октября 2008

У меня есть объект C # с критическим ресурсом, который нужно сбрасывать в очень конкретные моменты времени, что делает его плохим кандидатом, чтобы оставить его для сборщика мусора, чтобы позаботиться о нем, как только я смогу обойти это. ? Есть ли что-то вроде оператора удаления C ++, который позволит мне вручную убивать экземпляр этого объекта при необходимости?

Ответы [ 6 ]

21 голосов
/ 09 октября 2008

Вы ищете 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 голосов
/ 09 октября 2008

Интерфейс IDisposable существует для детерминированного уничтожения. Существует шаблон для его правильной реализации на MSDN .

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

2 голосов
/ 09 октября 2008

Это именно то, для чего предназначен интерфейс IDiposable. Вы высвобождаете критические ресурсы в методе Dispose(), а затем оставляете объект для утилиты удаления мусора, чтобы справиться с освобождением памяти.

0 голосов
/ 09 октября 2008

Если вы говорите о конкретном управляемом ресурсе, который, по вашему мнению, ДОЛЖЕН быть освобожден в определенное время, вы можете специально вызвать метод Collector Collectors Collectors после разыменования объекта, но есть соображения производительности, которые следует учитывать. подумал, как обычно сборщик мусора знает, когда собирать предметы. И вообще это плохая идея.

Как уже упоминалось выше, шаблон IDisposable полезен для освобождения неуправляемых ресурсов при необходимости.

ПРИМЕЧАНИЕ: Я повторюсь, вы МОЖЕТЕ вызвать GC.Collect (), но это НЕ хорошая вещь, но правильный ответ на вопрос!

0 голосов
/ 09 октября 2008

Интерфейс IDisposable был добавлен для поддержки детерминированного уничтожения в C ++ / CLI, и вы можете использовать его с любого языка .NET. Это то, что вы хотите.

0 голосов
/ 09 октября 2008

Google для интерфейса IDisposable. Это единственный доступный вам механизм. Это делается специально, если ваш критический ресурс неуправляем. Если это управляемый ресурс, не могли бы вы более точно указать, что нужно «очистить».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...