В .net (или Java) важно понимать, что переменная, поле или другое хранилище типа класса Foo
не содержит Foo
. Он содержит ссылку на Foo
. Аналогично, List<Foo>
не содержит Foo
с; он содержит ссылки на Foo
с. Во многих случаях программисту известно, что переменная содержит единственную существующую ссылку на какой-то конкретный Foo
. К сожалению, у компилятора нет общих средств узнать, содержит ли место хранения единственную существующую ссылку на объект, или содержит один из многих.
Основное правило о IDisposable
состоит в том, что объектам, которые реализуют IDisposable
, следует сказать, что они больше не нужны, когда-то между моментом, когда они фактически больше не нужны, и временем, когда все ссылки на них оставлены. Если объект не был Dispose
d, и код собирается перезаписать единственную существующую ссылку на него (либо путем сохранения null
, либо путем сохранения ссылки на что-то еще), объект должен иметь Dispose
метод называется. Если существует другая ссылка на объект, и владельцы этих ссылок ожидают, что продолжат использовать его, Dispose
вызывать не следует. Поскольку компилятор не может сказать, какая ситуация применима, он не вызывает Dispose
, но оставляет это для программиста (который, мы надеемся, лучше знает, вызывать его или нет).