Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#结构的局限性。为什么要密封?_C#_.net_Object_Struct - Fatal编程技术网

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应该表示(理想情况下是不可变的等)


结构在现实世界中真的有很多用途吗

对,;用于表示值-例如,a
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;
}
以上内容最好用
类来表示
。还有:财产

我知道它们比物体小

在某些方面,这是不正确的;例如,最有用的
struct
s大于引用-如果您在堆栈上传递超大
struct
s而不考虑您正在做什么,则可能会出现问题。

这并没有解决问题的“为什么”部分请参见、、、。请展示一些研究成果。:)+1“在类和结构之间切换比更改关键字要大得多”。来自gamedev-完全同意。