В StackOverflow есть несколько обсуждений о том, что делать, если мой объект управляет другими управляемыми объектами, которые реализуют System.IDisposable
.Устранение моего объекта System.IDisposable в моем финализаторе
Примечание: Ниже я не говорить о неуправляемого код. Я полностью понимаю важность очистки неуправляемого кода
Большинство дискуссий говорят, что если объект принадлежит другой управляемый объект, который реализует System.IDisposable
, то вы должны также осуществлять System.IDisposable
, в этом случае вы должны позвонить в Dispose()
из одноразовых предметов ваш объект держится. Это было бы логично, потому что вы не знаете, использует ли ваш одноразовый объект неуправляемый код. Вы только знаете, что создатель другого объекта подумал, что было бы разумно, если бы вы позвонили Dispose
, как только вам больше не понадобится этот объект.
Очень хорошее объяснение Одноразовая узор был дан здесь, на StackOverflow, под редакцией сообщества вики:
Proper use of the IDisposable interface
Довольно часто, а также в упомянутой ссылке, которую я прочитал:
«Вы не знаете порядок, в котором уничтожены два объекта. Вполне возможно, что в коде
Dispose()
управляемый объект, из которого вы пытаетесь избавиться, больше не существует».
Это меня озадачивает, поскольку я думал, что до тех пор, пока любой объект держит ссылку на объект X, объект X не будет и не может быть завершен.
Другими словами: до тех пор, пока мой объект содержит ссылку на объект X, я могу быть уверен, что объект X не завершен.
Если это так, то почему это может быть так, что если я сохраняю ссылку на мой объект до моего завершения, объект, на который я ссылаюсь, уже завершен?
Вот как я это понимаю: если 'Y' содержит единственную ссылку на' X', но 'Y' становится сиротой, то и' Y', и 'X' будут уничтожены. Поскольку заказ не гарантируется, 'X' может быть уничтожен до' Y'. –
Как часто, это сложнее, чем вы думаете. Я ссылаюсь на статью о блоге Эрика Липперта «Где все, что вы знаете, неправильно». http://ericlippert.com/2015/05/18/when-everything-you-know-is-wrong-part-one/ – Jodrell