struct和class区别的背后

[原创]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.
的原理有时间我会继续研究。 
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值