2008-11-10 2 views
1

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

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

редактирует:

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

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

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

ответ

2

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

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

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

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

+0

См. Редактировать в исходном посте. – ripper234 2008-11-10 13:30:06

2

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

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

+0

Не думаю, что композиция работает. Класс-помощник, возможно, был собран мусором перед классом IDisposable. – Mendelt 2008-11-10 13:25:36

1

Как сказал Марк Гравелл, вам нужно только финализатор, если вы работаете с неуправляемыми объектами. Вводя ненужные финализации в базовый классе это плохая идея, так как по причинам, в разделе 1.1.4 Dispose, Finalization, and Resource Management принципов:

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

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

Смежные вопросы