Почему структуры C# не могут быть унаследованы? [дубликат]


этот вопрос уже есть ответ здесь:

Я читаю CLR через C# Джеффри Рихтера, и он говорит, что структура является типом значения и не может быть унаследована.

есть ли какие-либо технические или философские причины?

3 79

3 ответа:

Edit: по-видимому, есть серьезные редакционные опасения по поводу этого сообщения. См. раздел комментариев.

немного того и другого.

философски, это работает - есть классы, которые являются "реальным" строительным блоком для объектно-ориентированного программирования, и есть структуры, которые являются легкими типами данных для хранения, но позволяют объектно-подобные вызовы методов для знакомства и удобства.

технически, будучи в "тип значения " означает, что вся структура - все ее содержимое - обычно хранятся там, где у вас есть переменная или член этого типа. Как локальную переменную или параметр функции, это означает, что в стеке. Для переменных-членов это означает, что они хранятся полностью как часть объекта.

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

Это просто интуитивно понятный, высокий уровень объяснение-см. комментарии и другие ответы для получения расширенной и более точной информации.

потому что это способ представления структур в .NET. они являются типами значений, а типы значений не имеют указателя таблицы методов, разрешающего наследование.

вы можете найти ответы на этот вопрос почему типы значений .NET запечатаны? соответствующие. В нем,@logicnp относится к ECMA 335, в которой говорится:

8.9.10 наследование типа значения

  • [...]
  • будет загерметизировано для избежания общаться с усложнениями отрезать значения.
  • более ограничительные правила, указанные здесь, позволяют более эффективно реализовать без сильно компрометируя функциональность.