我有一个问题,抓住结构的概念,没有人能回答我的问题。 我知道它“像”一个对象,你可以有方法和领域。 我不明白的是为什么他们被密封了。为什么缺乏继承和多态性 这限制了他们的能力。结构体是否有真正的现实世界用途,我知道它们比它小 一个对象,我找不到任何可以帮助我理解其好处的真实例子。 感谢。
答案 0 :(得分:18)
因为struct
是值 ;包含float
的结构正好是4个字节长。没有object-header指示具体类型是什么:知道类型的东西是编译器(以及生成的IL) - 类型信息在值中不是自包含的。因此,常规多态无法工作。如果你这样做:
MyType type = new MySubType(); // if this was a struct and if this compiled
然后从编译器的角度来看,它的类型是MyType
。在作业完成后,没有任何概念认为这是MySubType
。实际上,您可以使用unsafe
代码将一个值类型的位强制转换为另一个值。
此外,结构的相同方面意味着您将无法在子类型中添加字段:的大小必须固定,这使得这不可能。
基本上,如果你在考虑继承方面,那么你正在使用struct
;实际上,大多数时候,我看到人们使用struct
他们正在错误地使用它们。 struct
应代表值(理想情况下为不可变等)。
结构
真的有很多实际用途吗?
是;用于表示值 - 例如ComplexNumber
类型;对于某些高度优化的场景,其中GC禁止,但仅影响少数开发人员。 Here's one example of this;另一个常见的例子是“游戏”,但是:在class
和struct
之间切换比更改关键字更强更多更改。你需要知道自己在做什么,以及为什么要这样做。
你应该不做的事情是:
// ***BAD CODE: DO NOT DO***
public struct Customer
{ // I don't need inheritance; a struct will be faster and smaller
// yay me, I'm awesome
public int Id;
public string Name;
}
以上显然最好用class
表示。另外:属性。
我知道它们比对象小
在某些方面,这不是真的;例如,大多数有用的struct
都比引用大 - 如果你在堆栈中传递超大的struct
而不考虑你在做什么,这可能会有问题。
答案 1 :(得分:1)
很简单。 这是一种值类型,所有值类型都已密封。虽然你可以从界面继承它。