Почему структуры C# не могут быть унаследованы? [дубликат]
этот вопрос уже есть ответ здесь:
Я читаю CLR через C# Джеффри Рихтера, и он говорит, что структура является типом значения и не может быть унаследована.
есть ли какие-либо технические или философские причины?
3 ответа:
Edit: по-видимому, есть серьезные редакционные опасения по поводу этого сообщения. См. раздел комментариев.
немного того и другого.
философски, это работает - есть классы, которые являются "реальным" строительным блоком для объектно-ориентированного программирования, и есть структуры, которые являются легкими типами данных для хранения, но позволяют объектно-подобные вызовы методов для знакомства и удобства.
технически, будучи в "тип значения " означает, что вся структура - все ее содержимое - обычно хранятся там, где у вас есть переменная или член этого типа. Как локальную переменную или параметр функции, это означает, что в стеке. Для переменных-членов это означает, что они хранятся полностью как часть объекта.
в качестве (основного) примера того, почему наследование является проблемой, рассмотрим, как влияет хранение на низком уровне, если вы разрешили структурам иметь подтипы с большим количеством членов. Все, что хранит этот тип структуры, займет a переменный объем памяти, основанный на том, какой подтип он в конечном итоге содержит, что было бы кошмаром выделения. Объект данного класса больше не будет иметь постоянного, известного размера во время компиляции, и то же самое будет верно для стековых фреймов любого вызова метода. Это не происходит для объектов, которые имеют хранилище, выделенное в куче, и вместо этого имеют ссылки постоянного размера на это хранилище в стеке или внутри других объектов.
Это просто интуитивно понятный, высокий уровень объяснение-см. комментарии и другие ответы для получения расширенной и более точной информации.
потому что это способ представления структур в .NET. они являются типами значений, а типы значений не имеют указателя таблицы методов, разрешающего наследование.
вы можете найти ответы на этот вопрос почему типы значений .NET запечатаны? соответствующие. В нем,@logicnp относится к ECMA 335, в которой говорится:
8.9.10 наследование типа значения
- [...]
- будет загерметизировано для избежания общаться с усложнениями отрезать значения.
- более ограничительные правила, указанные здесь, позволяют более эффективно реализовать без сильно компрометируя функциональность.