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

时间:2013-12-04 09:23:16

标签: c# .net object struct

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

2 个答案:

答案 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;另一个常见的例子是“游戏”,但是:在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;
}

以上显然最好用class表示。另外:属性。

  

我知道它们比对象小

在某些方面,这不是真的;例如,大多数有用的struct都比引用大 - 如果你在堆栈中传递超大的struct而不考虑你在做什么,这可能会有问题。

答案 1 :(得分:1)

很简单。 这是一种值类型,所有值类型都已密封。虽然你可以从界面继承它。