微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

解决方法

因为结构是一个值;包含float的结构正好是4个字节长.没有object-header指示具体类型是什么:知道类型的东西是编译器(以及生成的IL) – 类型信息在值中不是自包含的.因此,常规多态无法工作.如果你这样做:

MyType type = new MySubType(); // if this was a struct and if this compiled

然后从编译器的角度来看,它的类型是MyType.在分配之后,没有任何概念,这是或者曾经是MySubType.实际上,您可以使用不安全的代码一个值类型的位强制转换为另一个值.

此外,结构的相同方面意味着您将无法在子类型中添加字段:必须修复大小,这使得这不可能.

基本上,如果你正在考虑继承,你使用的结构不正确;实际上,大多数时候,我看到人们使用结构,他们使用错误.结构应该代表值(理想情况下是不可变的等).

Is there really much real world use for a struct

是;用于表示值 – 例如,Complexnumber类型;对于某些高度优化的场景,GC过高,但只会影响少数开发人员. Here’s one example of this;另一个常见的例子是“游戏”,但是:在更改关键字时,在类和结构之间切换是一个更大的变化.你需要知道自己在做什么,以及为什么要这样做.

你不应该做的是:

// ***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;
}

以上显然最能代表一类.另外:属性.

I kNow they are smaller than an object

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐