Как уже отмечали другие, до тех пор, пока в диспетчере памяти нет реальной ошибки, классы, которые не используют неуправляемые ресурсы, не будут терять память.
В .NET вы видите не утечки памяти, а объекты, которые никогда не удаляются. Объект не будет удален, пока сборщик мусора сможет найти его на графе объектов. Поэтому, если какой-либо живой объект где-либо имеет ссылку на объект, он не будет уничтожен.
Регистрация событий - хороший способ сделать это. Если объект регистрируется для какого-либо события, то, что бы он ни зарегистрировал, имеет ссылку на него, и даже если вы исключите все остальные ссылки на объект, пока он не отменит регистрацию (или объект, с которым он зарегистрировался, станет недоступным), он останется живым.
Таким образом, вы должны следить за объектами, которые регистрируются для статических событий без вашего ведома. Например, отличная особенность ToolStrip
заключается в том, что если вы измените тему отображения, она автоматически отобразится в новой теме. Это выполняет эту изящную особенность, регистрируясь для статического события SystemEvents.UserPreferenceChanged
. Когда вы меняете тему Windows, событие вызывается, и все ToolStrip
объекты, которые прослушивают событие, получают уведомление о появлении новой темы.
Хорошо, предположим, вы решили выбросить ToolStrip
в вашей форме:
private void DiscardMyToolstrip()
{
Controls.Remove("MyToolStrip");
}
Теперь у вас есть ToolStrip
, который никогда не умрет. Даже если он больше не указан в вашей форме, каждый раз, когда пользователь меняет темы, Windows покорно сообщает об этом несуществующему ToolStrip
. Каждый раз, когда запускается сборщик мусора, он думает: «Я не могу выбросить этот объект, событие UserPreferenceChanged
использует его».
Это не утечка памяти. Но это может быть и так.
Подобные вещи делают профилировщик памяти бесценным. Запустите профилировщик памяти, и вы скажете: «Странно, кажется, в куче десять тысяч ToolStrip
объектов, хотя в моей форме только один. Как это произошло?»
О, и если вам интересно, почему некоторые люди считают, что установщики свойств являются злыми: чтобы получить ToolStrip
для отмены регистрации в событии UserPreferenceChanged
, установите для его свойства Visible
значение false
.