Так как C# использует Сборку "мусора". Когда необходимо использовать.Dispose для освобождения памяти?
Я понимаю, что существует несколько ситуаций, таким образом, я попытаюсь перечислить тех, я могу думать.
Теоретически, если вы правильно определили компоненты, никогда не должно требоваться вызывать Dispose () для ваших объектов, как это должен делать финализатор в конце концов позаботится об этом.
При этом каждый раз, когда вы используете объект, реализующий IDisposable, рекомендуется вызывать Dispose () для объекта, как только вы закончите работу с ним.
По некоторым конкретным вопросам:
1) Если вы знаете, что «закончили» с формой, вы можете вызвать для нее Dispose (). Это вызовет очистку в этот момент неуправляемых ресурсов, связанных с формой.
2) В этом случае: если ваш объект просто используется в этом методе, используйте вместо этого «using»:
using (MyObject myObject = new MyObject())
{
// use your object
} // It'll be disposed of here for you
3) Есть редкие причины для этого, но в целом нет.
4) События являются делегатом - память, связанная с делегатом, будет собрана после того, как сам делегат станет некорневым, что обычно происходит, когда рассматриваемые объекты не имеют root-доступа.
Вы должны вызвать Dispose
для каждого класса, реализующего IDisposable . Если бы его не нужно было Dispose
, то он не реализовал бы IDisposable
.
Что касается других ваших вопросов:
Controls
формы, то этот элемент управления будет автоматически удален при закрытии формы, поэтому вам ничего не нужно там делать . IDisposable
, необходимо вызвать Dispose
. Например, если вы перейдете к new FileStream (...)
, то нужно удалить FileStream, поскольку он реализует IDisposable. Я предлагаю вам ознакомиться с конструкцией using
в C #, которая упрощает работу с объектами IDisposable
. Если вы используете объект IDisposable
, рассмотрите возможность использования оператора using
для автоматической обработки удаления для ты.
Посмотрите на этот вопрос:
Есть ли общепринятая практика, как упростить освобождение памяти для сборщика мусора в .NET?
Если ваш класс создает экземпляр интерфейса IDisposable, это (вероятно) означает, что у него есть система ресурсы, которые необходимо утилизировать напрямую. Один из простых способов добиться этого - использовать ключевое слово using, например:
using(var g = Graphics.FromBitmap(bmp))
{
//Do some stuff with the graphics object
}
на ответ @Matt S в том вопросе, на который я ссылался.
На ваши вопросы:
Как сказал Рид Копси, обычно нет необходимости вызывать Dispose.
Возможный случай, который может создавать вашу проблему, заключается в том, что статический объект хранит ссылки на другие объекты, которые больше нигде не используются. Следующий код показывает пример:
Form_Load(...)
MyState.Instance.AddressChanged += this.User_AddressChanged;
End
Если по какой-то причине, когда форма выгружается, код не отменяет регистрацию обработчика события, на экземпляр формы все еще будет ссылаться объект state.