Dispose() или не Dispose () элементы в массиве IDisposable объектов?
существует множество примеров массивов или списков объектов IDisposable, возвращаемых из функций in .Сеть. Например,Process.GetProcesses()
.
- если я вызываю этот метод, это моя ответственность, чтобы Dispose () всех членов массива, как я итерации через них?
- Почему это должна быть моя ответственность, так как я никогда не создавал объекты и массив, который мне был дан, - это просто указатели на объекты, которые были созданы вне моего кода.
Я всегда думал, что это бремя создателя метода Dispose(). Так какое же здесь правильное правило?
3 ответов
нет общего правила. Это будет зависеть от ситуации и от того, как разработан данный метод, а также от того, отвечаете ли "вы" за удаление объектов, к которым у вас есть доступ. Именно здесь документация часто важна, чтобы помочь пользователям этого типа понять свои обязанности.
Я всегда думал, что это бремя Творца
Dispose()
Это не совсем верно. Иногда бывает так, что одноразовый объект будет переживать время жизни блока кода, создающего его. В то время как он простой когда творец can избавиться от объекта, иногда это просто невозможно для них, чтобы быть в состоянии. При возврате одноразового объекта из метода возникает ситуация, когда код, создающий одноразовый объект, часто не может его очистить, так как это время жизни должно быть меньше чем в жизни удаляемого объекта.
за относительно небольшими исключениями (большинство из которых можно описать как наименее злые подходы к работе с плохо разработанным кодом, который нельзя изменить), каждый IDisposable
экземпляр должен в любой момент времени иметь ровно четко определенного собственника. В случаях, когда метод возвращает что-то типа, реализующего IDisposable
, в контракте для метода будет указано, освобождается ли метод от владения (в этом случае вызывающий объект должен убедиться, что объект получает или путем избавления от самого объекта или отказа от права собственности на кого-то другого), или же метод просто возвращает ссылку на объект который принадлежит кому-то другому.
в правильно написанном коде вопрос о том, должен ли объект быть удален редко решение. Владелец объекта должен гарантировать, что он будет удален; никто другой не должен распоряжаться им. Иногда может быть необходимо иметь метод принимает параметр, указывающий, должен ли метод передавать право собственности на IDisposable
. Например, если код хочет создать звук, передать его в метод "начать воспроизведение звука" и никогда не хочет иметь дело с этим звуком снова, может быть наиболее удобно иметь код для воспроизведения звука принять и утилизировать звук, когда это будет сделано; если код хочет иметь возможность воспроизводить звук повторно, однако, и будет гарантировать, что звуковой объект будет оставаться в живых до тех пор, пока это необходимо, это будет более удобным для звукового воспроизведения кода является не взять на себя ответственность. Использование отдельных методов может быть в некотором смысле более чистым, но использование параметра может помочь инкапсуляции.
обычно, когда код возвращает список объектов, реализующих IDisposable
, целью кода является определение объекты без передачи какой-либо доли в них. При отсутствии права собственности код, получающий такой список, должен не вызов Dispose
на он.
правило очень простое: если вы думаете, что другие программы будут использовать IDisposables
, тогда не уничтожайте их. В противном случае, сделайте это.
например: GetProcesses()
возвращает другие процессы, потенциально используемые другими программами, поэтому вы не должны распоряжаться них.
С другой стороны, открытые вами файлы должны быть выпущены для других процессов в ОС, поэтому вы должны закрыть и удалить потоки обертки над ними (скажем,вы должны распоряжаться steam возвращается File.Open
метод).
обновление:
из MSDN:
- DO реализуйте базовый шаблон Dispose для типов, содержащих экземпляры одноразовых типов. См. раздел основной шаблон Dispose для деталей на основной картине. Если тип отвечает за срок службы других одноразовых объектов, разработчикам нужен способ утилизации и их тоже. Использование метода Dispose контейнера удобный способ сделать это возможным.
- DO реализовать базовый шаблон Dispose и предоставить финализатор для типов, содержащих ресурсы, которые должны быть freed явно и что не имеют финализаторов.
Например, шаблон должен быть реализован на хранение видах буферов памяти. В разделе Finalizable Types обсуждаются руководящие принципы, связанные с реализации финализаторов.- считают реализации Базовый шаблон Dispose для классов, которые сами не содержат неуправляемые ресурсы или одноразовые объекты, но, вероятно, имеют подтипы.