"что происходит с объектом IDisposable, для которого я не могу явно вызвать Dispose ()?"
Как правило, вы можете вызывать Dispose (неявно с помощью оператора using или явно) для всех одноразовых объектов, однако в гипотетическом сценарии, когда вы не можете , зависит от способ реализации объекта.
В общем случае .Net объекты будут следовать шаблону вдоль этих линий . Шаблон должен определить финализатор, который очищает вещи в случае, если утилита dispose не вызывается, а затем должен утилизировать подавление финализатора. Что снижает нагрузку на память и дает GC меньше работы.
Среди многих проблем с вызовом Dispose из финализатора является то, что вы превращаете однопотоковую проблему в многопоточную проблему, финализатор будет работать в другом потоке , который может предоставлять очень тонкие и сложные ловить жуков. Кроме того, это означает, что вы будете удерживать неуправляемые ресурсы дольше, чем ожидалось (например, вы открываете файл, забываете вызывать закрыть или утилизировать и в следующий раз, когда вы открываете его, он заблокирован)
Суть в том, что это лучшая практика по утилизации всех одноразовых предметов, в противном случае вы можете ввести странные и сложные ошибки. С оговоркой, что некоторые фреймворки, такие как sharepoint, возвращают общие экземпляры объектов, которые не следует утилизировать в соответствии с документацией.
Я обычно нахожу код гораздо более читабельным, когда располагаю свои объекты с помощью шаблона "using". Проблема с явным вызовом Dispose (object.Dispose ()) состоит в том, что может быть трудно отследить, где был размещен объект, и его очень легко забыть. Вы не можете забыть закрыть фигурную скобку оператора using, компилятор будет жаловаться :)
РЕДАКТИРОВАТЬ / GOTCHA
В соответствии с документацией MS Вы не должны вызывать dispose для ссылок на общие объекты точки совместного использования, которые возвращаются GetContextSite. Итак, вы должны быть очень осторожны здесь.
См. в этом ответе , где указан безопасный шаблон распределения, который вы должны использовать.
Однако, если у вас есть ссылка на
общий ресурс, например, когда
объект предоставляется
Метод GetContextSite в веб-части,
не используйте ни один из методов, чтобы закрыть
объект. Используя любой метод на
общий ресурс вызывает доступ
Произошла ошибка нарушения. В сценариях
где у вас есть ссылка на общий
ресурс, вместо этого пусть Windows
SharePoint Services или ваш портал
Приложение для управления объектом.