struct和class区别的背后

来源:互联网 发布:d3.js路径 编辑:程序博客网 时间:2024/06/05 18:44

[原创]struct和class区别的背后

结构与类共享几乎所有相同的语法,但结构比类受到的限制更多:

1、尽管结构的静态字段可以初始化,结构实例字段声明还是不能使用初始值设定项。

2、结构不能声明默认构造函数(没有参数的构造函数)或析构函数。

3、结构的副本由编译器自动创建和销毁,因此不需要使用默认构造函数和析构函数。实际上,编译器通过为所有字段赋予默认值(参见默认值表)来实现默认构造函数。结构不能从类或其他结构继承。

4、结构是值类型——如果从结构创建一个对象并将该对象赋给某个变量,变量则包含结构的全部值。复制包含结构的变量时,将复制所有数据,对新副本所做的任何修改都不会改变旧副本的数据。由于结构不使用引用,因此结构没有标识--具有相同数据的两个值类型实例是无法区分的。C# 中的所有值类型本质上都继承自 System.ValueType,后者继承自 Object。

编译器可以在一个称为装箱的过程中将值类型转换为引用类型。

结构具有以下特点:

  • 结构是值类型,而类是引用类型。
  • 向方法传递结构时,结构是通过传值方式传递的,而不是作为引用传递的。
  • 与类不同,结构的实例化可以不使用 new 运算符。
  • 结构可以声明构造函数,但它们必须带参数。
  • 一个结构不能从另一个结构或类继承,而且不能作为一个类的基。
  • 所有结构都直接继承自 System.ValueType,后者继承自 System.Object。
  • 结构可以实现接口。

在结构中初始化实例字段是错误的。


----------------------------------------------------------------------------------------

以上是引用的MSDN的说法。

现在引出问题

1、如果结构是值类型,但是结构成员可以是类,也就是说这个时候结构怎么分配内存呢?

  结构的副本由编译器自动创建和销毁,也就是说结构在编译的时候就确定了存储空间了,不是在运行时到托管堆里面去分配内存。所以结构成员的类成员其实是保存的这个类的实例的地址。

2、那structnew操作又是干什么的呢?

操作就是执行initobj指令,功能就是将位于指定地址的对象的所有字段初始化为空引用或适当的基元类型的0。如果是类的话实例化new的指令实际是newobj instance所以classnew操作和structnew操作是不一样的

像下面这个结构

public

struct TestStruct

{

public int n;

public string s;

public StringBuilder sb;

当他

TestStruct

t = new TestStruct();

new的时结果是什么?其结果就是int类型被初始化为0,对象全部被置为null

结论

structnew操作是不执行分配内存操作的,其new操作只执行初始化数据操作。所以微软关于new关键字的用途的说法是不全面的。因为new还有一种只初始化数据而不在托管堆分配内存的功能。所以值类型和引用类型的实质我个人认为其实就是在什么时候分配内存和其传值调用方式。

注1

MSDNnew关键字用途的说法:

(1)new运算符
用于创建对象和调用构造函数。
(2)new修饰符
用于向基类成员隐藏继承成员。
(3)new约束
用于在泛型声明中约束可能用作类型参数的参数的类型。

注2

System.ValueType本来就是比较怪的一个东西。
.NET的编译器在处理他的时候是
1、把值存在计算堆栈上,这个是值类型的标准操作。
2、产生一个装箱操作如果初始化的是一个33这样的整数,那就装箱一个int32同理如果是3.3就是float。
3、执行一个stloc从计算堆栈的顶部弹出当前值并将其存储到指定索引处的局部变量列表中。
个人理解:System.ValueType更像是一个系统内置接口(当然应该不是真的接口)。而接口在平台当中不管是Java还是.NET都意味着一旦继承了这种系统内置接口,就会响应系统内部的某种处理或调用。

posted on 2006-07-03 19:28 Hussar 阅读(1166) 评论(5)  编辑 收藏 引用 收藏至365Key 所属分类: .NET Framework

}

Feedback

# re: [原创]struct和class区别的背后 2006-07-04 02:06 Lostinet

有那么多限制是因为必须让结构数据不被初始化,即所有成员为类型默认值。
ValueType纯粹是为了反射而做。
当然ValueType vt=33;是允许的。但和object obj=33;没什么不同。
有趣的是typeof(System.ValueType)本身是引用类型。。
vt这个变量如果被传递,那么也是按引用传递。

C#关键字说法没错。因为无法用C#本身去证明这个new的说法有错误。

  回复   

# re: [原创]struct和class区别的背后 2006-07-04 09:09 i.Posei

<C#高级程序设计>和<.Net框架程序设计>有详细的分析的~  回复   

# re: [原创]struct和class区别的背后 2006-07-04 09:09 i.Posei

不过仍然不错!  回复   

# re: [原创]struct和class区别的背后 2006-07-05 15:04 Icebird

from <<C# in a Nutshell, 2nd Edition>>

A struct is similar to a class, with the following major differences:

A class is a reference type, while a struct is a value type. Consequently, structs are typically used to express simple types, in which value-type semantics are desirable (e.g., assignment copies a value rather than a reference).

A class fully supports inheritance , whereas a struct can inherit only from an object and is implicitly sealed (in the runtime structs actually inherit from System.ValueType). Both classes and structs can implement interfaces.

A class can have a destructor, and a struct cannot.

A class can define a custom parameterless constructor and initialize instance fields, while a struct cannot. The default parameterless constructor for a struct initializes each field with a default value (effectively zero). If a struct declares a constructor(s), then all of its fields must be assigned in that constructor call.
  回复   

# re: [原创]struct和class区别的背后 2006-07-05 23:02 Hussar

C# in a Nutshell, 2nd Edition
的表述其实和MSDN差不多。
A struct is similar to a class这种说法最早来源于C++。
但是C++的struct和C#的struct有一个区别。
C++的struct的成员默认是public
C#的struct的成员默认是private
If a struct declares a constructor(s), then all of its fields must be assigned in that constructor call.
的原理有时间我会继续研究。 
 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 乳房发育一边大一边小怎么办 母猫乳房有硬块怎么办 19岁乳晕很大乳头很小怎么办 做完俯卧撑胳膊特别痛怎么办 电压低风扇转不动怎么办 小孩不配合康复锻炼怎么办 跑步机安全开关脱落怎么办 办健身卡贵了怎么办 跑步机安全锁丢了怎么办 老公的腿老是疼怎么办 跑步机钥匙丢了怎么办 跑步机磁铁丢了怎么办 瑜伽拉筋拉伤了怎么办康复 大腿拉筋拉伤了怎么办 肚子饿的咕咕叫怎么办 手表折叠扣松了怎么办? 手表链扣松了怎么办? 原车挡泥板碎了怎么办 车检通不过的车怎么办 车子被轻微刮了怎么办 车龙门架弯了怎么办 材料合格工地非说不合格怎么办 汽车翼子板撞过弄好缝隙大怎么办 手表秒针摔掉了怎么办 元征升降机泄压怎么办 自拍杆的杆子往下下滑怎么办 小狗被车压了一下拉血怎么办 有鬼给你磕头让你不好怎么办 腿又粗又短怎么办 腿又短又粗怎么办 因跑步小腿变粗怎么办 健身后小腿变粗怎么办 打非洲鼓打的手疼怎么办 无塔供水压力小怎么办 家用增压水塔压力不稳定怎么办 蝴蝶耳堵比较紧怎么办 跑步机踏板坏了怎么办 遥控器电池没电了怎么办 空调遥控器电池没电了怎么办 想要自慰家里没有情趣用品怎么办 对政协提案的答复有意见怎么办