i.Posei's blog

Happiness only real when shared!
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

基础 - 结构

Posted on 2006-03-20 12:53  i.Posei  阅读(381)  评论(0编辑  收藏  举报

     可以把结构看做缩小的类,适合于把一些数据组合起来的场合。结构是值类型,因此new运算符与类和其他引用类型的工作方式不同。new运算符不是分配堆中的内存,而是调用默认的构造函数,在堆栈上把所有的字段初始化为默认值。对于下边的语句:

TestStruct pt;
pt.length 
= 4;
pt.width 
= 2;


     如果TestStruct 是一个类,那么就会产生一个编译错误,因为pt包含一个未初始化的引用(未指向任何地方),所以不能给其字段赋值。但是对于结构,声明变量实际上是为整个结构分配栈中的空间,所以就可以赋值了。但注意下边语句会产生一个编译错误,

TestStruct pt;
Double d 
= pt.length;


     这是因为虽然已经为结构分配的空间,但是变量并没有初始化。只有调用了new运算符或者给所有的字段分别赋值,结构才完成了初始化,也只有在此之后才能调用结构提供的方法。如下语句会产生一个编译错误:

TestStruct pt;
pt.print();


     由于结构是值类型,因此把结构作为参数来传递或把一个结构赋给另一个结构,结构中的所有内容都会被复制,这样一来,就会有性能上的损失,如果把结构做为ref参数传递,就可以避免性能损失,因为只传递了结构在内存中的地址。
     不能从一个结构中继承,也不能从任何类中派生。特别的一点是结构派生于System.Objec,因此结构能重写ToString()方法。在结构中声明方法的方式和在类中是一样的,但是不能把结构的任何成员声明为virtual(结构不允许被继承),也不能把结构声明为abstract或把结构显式的声明为sealed(结构总是隐式密封的)。
     不能为结构定义无参数的构造函数。在结构的定义中,也不能提供字段的初始值,以此来绕过默认构造函数,事实上默认的构造函数总是隐式地给出,即使提供了其他带参的构造函数。

Key Points:1. 结构是值类型,而不是引用类型;
2. 机构不支持继承,不能把结构的成员声明为virtual,把结构声明为abstract或显式的声明为sealed;
3. 结构不允许定义无参数的构造函数;
4. 在结构完成初始化之前,不能用结构的成员变量给其他变量赋值,也不能调用结构提供的方法;
5. 把结构作为ref参数传递给方法,可以避免性能上的损失。