我正在通过Jeffery Richter的C#阅读CLR,它说结构是一种值类型,不能继承。
有任何技术或哲学原因吗?
答案 0 :(得分:83)
编辑:显然,这篇文章存在严重的编辑问题。见评论部分。
两者都有。
哲学,它可以解决 - 有一些类,它们是面向对象编程的“真正”构建块,并且有一些结构,它们是用于存储的轻量级数据类型,但允许类似于对象方法需要熟悉和方便。
技术上,作为“值类型”意味着整个结构 - 所有内容 - (通常)存储在您拥有变量或该类型成员的任何地方。作为局部变量或函数参数,这意味着在堆栈上。对于成员变量,这意味着完全存储为对象的一部分。
作为继承是一个问题的(主要)示例,如果允许结构具有包含更多成员的子类型,请考虑如何在较低级别影响存储。存储该结构类型的任何东西都会根据它最终包含的子类型占用可变数量的内存,这将是一个分配的噩梦。给定类的对象在编译时不再具有常量的已知大小,并且对于任何方法调用的堆栈帧都是如此。对于具有在堆上分配存储的对象而言,这不会发生,而是对堆栈上或其他对象内的存储具有恒定大小的引用。
这只是一个直观的,高级别的解释 - 查看扩展和更精确信息的评论和其他答案。
答案 1 :(得分:35)
因为它是.NET中表示结构的方式。它们是值类型,值类型没有允许继承的方法表指针。
答案 2 :(得分:15)
您可以找到与问题Why are .NET value types sealed?相关的答案。其中,@logicnp引用ECMA 335,其中指出:
8.9.10值类型继承
- [...]
- 将密封以避免处理价值切片的并发症。
- 此处指定的限制性规则允许更有效的实施,而不会严重影响功能。