我有一个问题,抓住结构的概念,没有人能回答我的问题.我知道它"像"一个对象,你可以有方法和领域.我不明白的是为什么他们被密封了.为什么缺乏继承和多态性限制了他们的能力.结构体是否真的有很多现实世界的使用,我知道它们比一个对象小,我找不到任何真正的例子来帮助我理解它的好处.谢谢.
Mar*_*ell 18
因为a struct 是一个值 ; 包含a的结构float正好是4个字节长.没有object-header指示具体类型是什么:知道类型的东西是编译器(以及生成的IL) - 类型信息在值中不是自包含的.因此,常规多态无法工作.如果你这样做:
MyType type = new MySubType(); // if this was a struct and if this compiled
Run Code Online (Sandbox Code Playgroud)
然后从编译器的角度来看,它的类型是MyType.在任务之后,没有任何概念,这是或曾经是一个MySubType.实际上,您可以使用unsafe代码将一个值类型的位强制转换为另一个值.
此外,结构的相同方面意味着您将无法在子类型中添加字段:必须修复大小,这使得这不可能.
基本上,如果你正在考虑继承,你使用的struct是错误的; 实际上,大多数时候,我看到人们使用structs,他们正在错误地使用它们.structs应该代表值(理想情况下是不可变的等).
结构体真的有很多实际用途吗?
是; 用于表示值 - ComplexNumber例如类型; 对于某些高度优化的场景,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;
}
Run Code Online (Sandbox Code Playgroud)
以上显然最好用a表示class.另外:属性.
我知道它们比物体小
在某些方面,这不是真的; 例如,大多数有用的structs都比引用大 - 如果你struct在堆栈中传递超大尺寸的s而不考虑你在做什么,这可能会有问题.
| 归档时间: |
|
| 查看次数: |
1423 次 |
| 最近记录: |