Могу ли я реализовать абстрактный класс DisposeBase? - PullRequest
1 голос
/ 10 ноября 2008

Есть ли уловка или скрытая проблема при использовании базового класса DisposableBase вместо перекодирования шаблона Dispose для каждого класса?

Почему не все используют такой соответствующий класс?

редактирует

  1. Естественно, я имел в виду только классы, реализующие IDisposable

  2. Я знаю, что он использует опцию наследования, но я готов заплатить цену (по крайней мере, когда смогу, и это не повредит мне в противном случае).

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

Ответы [ 3 ]

2 голосов
/ 10 ноября 2008

Ну, он использует ваш единственный вариант наследования для описания одного аспекта вашего класса - это не идеально, IMO. Было бы интересно попытаться что-то сделать с композицией, где у вас есть ссылка на DisposableHelper, а реализация IDisposable просто вызывает helper.Dispose, в котором есть остальная часть шаблонной логики и которая может вызывать ваш код через делегат обратного вызова. Хм. Подклассы могут подписаться на защищенное событие Disposing, чтобы зарегистрировать «Мне нужно что-то сделать» ... это может стоить посмотреть через некоторое время.

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

2 голосов
/ 10 ноября 2008

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

Лично я не стал бы беспокоиться о таком базовом классе. В частности, наследование (в мире с одним наследованием) очень быстро становится ограничительным. Но, что более важно, переопределение метода мало чем отличается от простого предоставления открытого метода Dispose ().

Опять же: вам нужен финализатор и т. Д. Только если вы работаете с неуправляемыми объектами.

Если бы у меня было много таких (неуправляемых ресурсов), я мог бы посмотреть, смогу ли я получить PostSharp , чтобы сделать работу за меня. Я не знаю, существует ли он уже, но возможно создать аспект, который обрабатывает (в частности) финализатор и т. Д. Кто знает ...

1 голос
/ 10 ноября 2008

Как сказал Марк Гравелл, вам нужен финализатор, только если вы работаете с неуправляемыми объектами. Представлять ненужный финализатор в базовом классе - плохая идея, в соответствии с причинами, приведенными в разделе 1.1.4 Рекомендации по утилизации, финализации и управлению ресурсами :

Существует реальная стоимость, связанная с экземпляры с финализаторами, как из производительность и сложность кода точка зрения. ... Завершение увеличивает стоимость и продолжительность время жизни вашего объекта как каждый финализируемый объект должен быть размещен на специальная очередь регистрации финализатора когда выделено, по сути, создавая дополнительное поле размером с указатель для ссылки к вашему объекту. Кроме того, объекты в по этой очереди ходят во время GC, обработан, и в конечном итоге повышен до еще одна очередь, которую GC использует для выполнить финализаторы. Увеличение количество финализируемых объектов напрямую коррелирует с большим количеством объектов, являющихся повышен до более высоких поколений, и увеличенное количество времени, затрачиваемое GC пешеходные очереди, движущиеся указатели вокруг, и выполнение финализаторов. Кроме того, сохраняя состояние вашего объекта дольше, вы склонны использовать память в течение более длительного периода времени, который приводит к увеличению рабочего набора.

Если вы используете SafeHandle (и связанные с ним классы), маловероятно, что какие-либо классы, производные от DisposableBase, когда-либо будут нуждаться в финализации.

...