Будет ли сборщик мусора автоматически освобождать неуправляемые ресурсы (какими бы они ни были), связанные с каким-либо экземпляром IDisposable, если, например, я забыл написать с помощью оператора?
Обычно, но необязательно.Автору одноразового ресурса нужно поступать правильно.
Очевидно, я не знаю, когда это произойдет, но нормально ли оставлять ID доступным для GC, когда я этого не делаю?Забота об этих ресурсах, и я в порядке с тем, что они будут в конечном итоге уничтожены?
Ваш вопрос предполагает ложь. Сборщик мусора никогда не вызывает Dispose, никогда. Скорее сборщик мусора вызывает деструктор (или «финализатор», если вы предпочитаете).Это деструктор, который может вызвать или не вызвать Dispose для забывчивого пользователя.
Ваш вопрос также указывает на плохое отношение. Вам может быть все равно, если ресурсы будут освобождены с опозданием, но другая программа, безусловно, может заботиться!Что если ваш клиент запускает две программы, которые обе пытаются получить доступ к одному и тому же неуправляемому ресурсу, одна написана вами, а другая - кем-то другим? Будь хорошим гражданином;освободите свои ограниченные ресурсы, как только вы закончите с ними, чтобы их могли использовать другие программы. Это реальная цель "использования" - быть вежливым, обеспечивая быстрое восстановление ограниченных ресурсов.
Правильная реализация шаблона Dispose гарантирует, что деструктор очищает неуправляемые ресурсы, если пользователь забывает вызывать Dispose, и гарантирует, что деструктор НЕ очищает ресурсы, если они помнят.
Если вы человек, пишущий реализацию Dispose для класса, которому принадлежат неуправляемые ресурсы , вы несете ответственность за правильное получение кода деструктора для случая, когда пользователь неправильно вызывает Dispose. Правильный способ написания этого кода чрезвычайно хорошо документирован;последовать примеру.См. Комментарии Джона для некоторых полезных ссылок.
Обратите также внимание на то, что если вы пишете такой класс, вы должны также заставить его работать в сценариях, в которых для пользователя невозможно позвоните утилизировать.Например, предположим, что конструктор выделяет два неуправляемых ресурса, а между выделением первого и второго выдается исключение и перехватывается за пределами конструктора.Тогда пользователь не сможет вызвать Dispose, потому что назначение новой ссылки на объект происходит после успешного выполнения конструктора, и конструктор так и не завершил свою работу успешно.Как освободить первый неуправляемый ресурс?Только деструктор может освободить его.Деструктор должен быть устойчивым перед лицом таких сценариев;разрушенный объект, возможно, никогда не был полностью построен, поэтому вы не можете полагаться на какой-либо инвариант конструктора.