Утилизировать на вложенных одноразовых предметах? - PullRequest
4 голосов
/ 22 июля 2010

Я хотел бы знать, существуют ли какие-либо соглашения об утилизации одноразовых предметов, вложенных в другой одноразовый предмет (в области собственности / публичной сфере, а не в качестве частных членов).Например, DataSet содержит DataTable (s), а SqlCommand содержит SqlConnection.

Очевидно, что класс должен избавиться от всех принадлежащих ему элементов Disposable и оставить остальные.Существует ли такая конвенция?Если да, то как библиотеки .NET определяют, кому и чем принадлежит?Как я могу узнать, располагаются ли вложенные объекты?

PS: я некоторое время размышлял об этом, и, очевидно, у других тоже: Что удаляется при вызове SqlCommand.Dispose?

Редактировать 1: обнаружил, что утилита DataSet не располагает свои таблицы.

// Fill dataset from sqldataadpater.
foreach (DataTable dt in dataSet.Tables)
{
    dt.Disposed += Program.DisposedEventHandler2;
}
Console.WriteLine("Disposing dataset");
dataSet.Dispose(); //Event not fired here.
Console.WriteLine("Disposing datatables maually");
foreach (DataTable dt in dataSet.Tables)
{
    dt.Dispose(); //Event fired here
}
#endregion

Ответы [ 3 ]

7 голосов
/ 22 июля 2010

Эмпирическое правило, которым я обычно следую, заключается в том, что класс, который создает одноразовый объект, также будет им распоряжаться.Как пример: SqlCommand не располагает своим соединением, потому что оно не создавало его.StreamReader ведет себя странно в этом смысле, потому что он всегда будет располагать основным потоком, даже если он поступает извне (я нахожу это очень раздражающим, пожалуйста, проголосуйте ЗДЕСЬ , когда вы хотите, чтобы Microsoftисправить это).

3 голосов
/ 22 июля 2010

Я бы сказал, что обычно контейнер будет утилизировать любые содержащиеся одноразовые предметы - например, StreamReader удаляет базовый поток - но обычно я распоряжаюсь каждым элементом отдельным оператором usingв любом случае.

Любое понятие «владение» действительно просто в документации и соглашении.По сути, вы должны знать, что и чем будет распоряжаться, что, как правило, означает чтение документации и надеется, что она прояснит это.К сожалению, это не всегда так: (

Обратите внимание, что здесь нет единственного правильного ответа - иногда вы можете захотеть, чтобы тип вел себя так, а иногда - другой. Некоторые типы явно позволяют вам указать,эффективно передаем право собственности на ресурс, хотя большинство этого не делают.

0 голосов
/ 18 апреля 2012

Лучшим подходом часто является предоставление вложенным идентифицируемым элементам индикатора того, следует ли размещать вложенный элемент вместе с контейнером, если срок полезного использования элемента никогда не будет превышать срок службы контейнера (в этом случае утилизация контейнераможет распоряжаться предметом), или можно быть уверенным, что последний объект, кроме контейнера, которому понадобится содержащийся предмет, будет знать о его существовании и необходимости удаления (имеется в виду, что контейнеру не нужно беспокоиться об удалении, так как другойэлемент может с этим справиться).

В качестве простого примера, предположим, что кто-то разрабатывал структуру пользовательского интерфейса и хотел предоставить элемент управления, который должен отображать Picture, и предоставляет средство, с помощью которого код может предоставитьизображение для отображения.Предположим далее, что некоторые типы Picture имеют ресурсы, которые необходимо утилизировать.В некоторых ситуациях код может захотеть отобразить определенное значение Picture на нескольких элементах управления, которые могут быть удалены не все одновременно.В такой ситуации было бы плохо, если бы распоряжаться элементом управления было бы распоряжаться его изображением.С другой стороны, существуют другие ситуации, когда код может создать изображение с целью отображения, передать его элементу управления, а затем больше не заботиться о нем.В такой ситуации код, предоставляющий изображение, может знать, что изображение должно быть удалено, когда элемент управления больше не нуждается в нем, но может не знать, когда это произойдет.

Использование параметра для указания того, должно ли изображениебыть Disposed позволит чистый код в обоих вышеупомянутых сценариях.Альтернативный подход, который использует Winforms, заключается в том, чтобы иметь события, которые происходят, когда изменяется либо изображение элемента управления, либо когда изменяется свойство Image.Код, который устанавливает свойство Image элемента управления для изображения, которое требует удаления, может использовать эти события для его обработки.

...