Я хотел бы услышать, какова мотивация большинства закрытых классов в структуре .Net. Какая польза от запечатывания класса? Я не могу понять, как запрет на наследование может быть полезным и, скорее всего, не единственным, кто борется с этими классами.
Итак, почему фреймворк спроектирован таким образом и разве не будет решающим изменением распечатать все? Должна быть другая причина, но просто быть злым?
.net
performance
mmiika
источник
источник
Ответы:
Статья MSDN по этой теме - Ограничение расширяемости с помощью классов уплотнения .
источник
Классы должны быть либо предназначены для наследования, либо запрещать его. За проектирование для наследования нужно платить:
В пункте 17 «Эффективной Java» содержится более подробная информация об этом - независимо от того, что он написан в контексте Java, совет применим также и к .NET.
Лично я хочу, чтобы классы были запечатаны по умолчанию в .NET.
источник
Похоже, что официальные руководящие принципы Microsoft по запечатыванию эволюционировали с тех пор, как этот вопрос был задан ~ 9 лет назад, и они перешли от философии согласия (печать по умолчанию) к отказу (по умолчанию не запечатывать):
Действительно, если вы выполните поиск в кодовой базе ASP.Net Core , вы найдете только около 30 случаев
sealed class
, большинство из которых являются атрибутами и тестовыми классами.Я действительно думаю, что сохранение неизменности - хороший аргумент в пользу запечатывания.
источник
Я нашел это предложение в документации msdn: «Запечатанные классы в основном используются для предотвращения образования производных. Поскольку они никогда не могут использоваться в качестве базового класса, некоторые оптимизации во время выполнения могут сделать вызов запечатанных членов класса немного быстрее».
Я не знаю, является ли производительность единственным преимуществом закрытых классов, и лично я также хотел бы знать какие-либо другие причины ...
источник
Производительность является важным фактором, например, строковый класс в java является окончательным (<- запечатанный), и причиной этого является только производительность. Я думаю, что еще один важный момент - избежать проблемы хрупкого базового класса, подробно описанной здесь: http://blogs.msdn.com/ericlippert/archive/2004/01/07/virtual-methods-and-brittle-base-classes. aspx
Если вы предоставляете фреймворк, это важно для поддерживаемых устаревших проектов и для обновления фреймворка, чтобы избежать проблемы хрупкого базового класса.
источник
String
класс может даже не быть подклассом, даже если он не был окончательным.Sealed используется для предотвращения «проблемы хрупкого базового класса». Я нашел хорошую статью в MSDN, которая объясняет это.
источник
Герметизация позволяет получить незначительный прирост производительности. Это менее верно в мире JIT и ленивой пессимизации, чем в мире, скажем, C ++, но поскольку .NET не так хорош, как пессимизация, как компиляторы Java, в основном из-за различных философий проектирования, он все еще полезен. Он сообщает компилятору, что он может напрямую вызывать любые виртуальные методы, а не вызывать их косвенно через vtable.
Это также важно, когда вам нужен «закрытый мир» для таких вещей, как сравнение равенства. Обычно, когда я определяю виртуальный метод, мне очень хочется определить понятие сравнения на равенство, которое действительно реализует эту идею. С другой стороны, я мог бы определить его для конкретного подкласса класса с помощью виртуального метода. Запечатывание этого класса гарантирует, что равенство действительно выполняется.
источник
Запечатывание класса упрощает управление одноразовыми ресурсами.
источник
Чтобы определить, следует ли запечатать класс, метод или свойство, обычно следует учитывать следующие два момента:
• Потенциальные преимущества, которые производные классы могут получить за счет возможности настройки вашего класса.
• Возможность того, что производные классы могут изменить ваши классы таким образом, что они больше не будут работать правильно или как ожидалось.
источник
Еще одно соображение заключается в том, что запечатанные классы не могут быть заглушены в ваших модульных тестах. Из документации Microsoft :
источник