C#结构的限制.他们为什么要密封?

3 .net c# struct object

我有一个问题,抓住结构的概念,没有人能回答我的问题.我知道它"像"一个对象,你可以有方法和领域.我不明白的是为什么他们被密封了.为什么缺乏继承和多态性限制了他们的能力.结构体是否真的有很多现实世界的使用,我知道它们比一个对象小,我找不到任何真正的例子来帮助我理解它的好处.谢谢.

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过高,但只会影响少数开发人员.这是一个例子 ; 另一个常见的例子是"游戏",而是:切换classstruct多少不是改变关键字较大的变化.你需要知道自己在做什么,以及为什么要这样做.

你应该不会做的是一样的事情:

// ***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而不考虑你在做什么,这可能会有问题.