2008-10-09 3 views
8

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

ответ

2

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

0

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

0

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

0

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

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

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

+1

Не вызывайте GC.Collect(). Плохая привычка вступать и, как правило, более вредна, чем полезно. – Will 2008-10-09 18:27:49

2

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

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

20

Вы ищете 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 вызывается в конце его объема.

Смежные вопросы