C#结构的局限性。为什么要密封?
我在理解结构的概念时遇到了一些问题,没有人能回答我的问题。 我知道它“像”一个对象,你可以有方法和字段。 我不明白的是它们为什么被密封。为什么缺少继承和多态性 这限制了他们的能力。结构在现实世界中真的有很多用途吗?我知道它们比 作为一个对象,我只是找不到任何真正的例子来帮助我理解它的好处。C#结构的局限性。为什么要密封?,c#,.net,object,struct,C#,.net,Object,Struct,我在理解结构的概念时遇到了一些问题,没有人能回答我的问题。 我知道它“像”一个对象,你可以有方法和字段。 我不明白的是它们为什么被密封。为什么缺少继承和多态性 这限制了他们的能力。结构在现实世界中真的有很多用途吗?我知道它们比 作为一个对象,我只是找不到任何真正的例子来帮助我理解它的好处。 谢谢。很简单它是一种值类型,所有值类型都是密封的。尽管您可以从接口继承它 因为struct是一个值;包含浮点值的结构正好有4个字节长。没有对象头指示具体类型是什么:知道类型的东西是编译器(以及结果IL)-类型
谢谢。很简单它是一种值类型,所有值类型都是密封的。尽管您可以从接口继承它 因为
struct
是一个值;包含浮点值的结构正好有4个字节长。没有对象头指示具体类型是什么:知道类型的东西是编译器(以及结果IL)-类型信息在值中不是自包含的。因此,常规多态性无法工作。如果您这样做:
MyType type = new MySubType(); // if this was a struct and if this compiled
然后从编译器的角度来看,它的类型是MyType
。在赋值之后,没有任何概念表明这是或曾经是MySubType
。实际上,您可以使用不安全的代码将一种值类型的位强制转换为另一种值类型
此外,结构的这一方面意味着您将无法在子类型中添加字段:大小必须固定,这使得这不可能
基本上,如果您从继承的角度考虑,那么您使用的struct
s是错误的;事实上,大多数时候,我看到人们使用struct
s,但他们使用得不正确<代码>结构
s应该表示值(理想情况下是不可变的等)
结构在现实世界中真的有很多用途吗
对,;用于表示值-例如,aComplexNumber
类型;对于一些高度优化的
场景,GC是禁止的,但只影响少数开发人员;另一个常见的例子是“游戏”,但是:在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;
}
以上内容最好用类来表示
。还有:财产
我知道它们比物体小
在某些方面,这是不正确的;例如,最有用的struct
s大于引用-如果您在堆栈上传递超大struct
s而不考虑您正在做什么,则可能会出现问题。这并没有解决问题的“为什么”部分请参见、、、。请展示一些研究成果。:)+1“在类和结构之间切换比更改关键字要大得多”。来自gamedev-完全同意。