Официально в C # утечек памяти не существует. Память освобождается через некоторое время после того, как ее никто больше не использует.
Однако для некоторых случаев это слишком поздно. Особенно, если ваш объект использует дефицитный ресурс, вы, возможно, захотите, чтобы объект «разрушился» раньше.
Всякий раз, когда вы видите, что класс реализует System.IDisposable, разработчик этого класса думал, что было бы разумно утилизировать объект, как только он вам больше не нужен. Таким образом ресурсы освобождаются намного раньше, чем сборщик мусора сделает это.
Если вы не утилизируете объект, сборщик мусора сделает это за вас ... в конце концов. Но если вы хотите освободить свои ресурсы раньше, позаботьтесь о том, чтобы вы вызвали Dispose, как только вам больше не нужен объект.
Вы говорите о пользовательских элементах управления. Пользовательский элемент управления представляет собой Control и реализует System.IDisposable. Так что вы должны позвонить утилизировать. Если вы этого не сделаете, потребуется некоторое время, прежде чем ресурсы будут освобождены.
Самый простой способ убедиться, что объект располагается как только он не нужен, - это оператор using:
using (var myFile = File.Create(...))
{
myFile.Write(...)
...
}
myFile корректно очищается / закрывается / удаляется / завершается, даже если у вас есть исключения или вы вышли из блока использования по любой причине: возврат / останов, что угодно.
Реализация System.IDisposable часто выполняется с использованием шаблона. Этот шаблон состоит из создания дополнительной функции Dispose (bool), которая вызывается функцией Dispose и Destructor. Параметр bool указывает, выбрасываете ли вы или нет.
class TextWriter : System.IDisposable
{
private StreamWriter writer = null;
public TextWriter(string fileName)
{
this.writer = StreamWriter(fileName);
}
~TextWriter() // destructor
{
this.Dispose(false); // false: I am not disposing
}
public void Dispose()
{
this.Dispose(true); // true: I am disposing
GC.SuppressFinalize(this);
// tell the garbage collector that this object doesn't need to be
// finalized (destructed) anymore
}
private void Dispose(bool dispose)
{
if (this.writer != null)
{
this.writer.Dispose();
this.writer = null;
}
}
...
}
Лично мне никогда не приходилось использовать логическое удаление. Официально написано:
true для освобождения как управляемых, так и неуправляемых ресурсов; false для освобождения только неуправляемых ресурсов.
Но я не могу понять, почему я не хочу выпускать управляемые ресурсы.
Если вы получаете предупреждение о том, что ваш Dispose () скрывает другой Dispose (), вы, вероятно, наследуетесь от чего-то, что реализует System.IDisposable. В этом случае вам не нужны деструктор и Dispose (), вам нужен только Dispose (bool). Посмотрите его в MSDN, и вы увидите, что можете переопределить его.