日期:2011-06-13  浏览次数:20401 次

最近有看到网上面试题提到结构鱼类的区别,遂查看了msdn以及一些网上的资料总结了一下,一做学习之用
C#学习之结构与类的区别
数据结构和类实际上都是创建对象的模版,每个对象都包含数据,并提供了处理和访问数据的方法。在语法上,非常相似,主要是使用关键字的区别。对于类和结构,都是使用关键字new来声明实例:这个关键字对象创建对象,并对其进行初始化。
 
1、值类型和引用类型
结构是指类型,指类型在堆栈(栈)上分配地址,C#中的所有基类型都是结构类型(例如:int对应System.Int32结构);
类是引用类型,引用类型是在堆上分配地址;
堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑复杂的对象。所以结构处理作为基类型对待的小对象,而类处理某个商业逻辑;
因为结构是值类型所以结构之间的赋值可以创建新的结构,而类是引用类型,类之间的赋值只是复制引用;(所以在以结构为参数传递时,最好使用ref,这样只传递地址引用,能够提高效率,同时也应注意这样结构的值也会随着方法调用而改变)
关于堆和堆栈的比较参见http://blog.csdn.net/fengziyoyo/archive/2006/12/28/1465761.aspx。
注:
  a.虽然结构与类的类型不一样,可是他们的基类型都是对象(object),c#中所有类型的基类型都是object
b.虽然结构的初始化使用了New操作符,可是结构对象依然分配在堆栈上,如果不使用New那么在初始化所有字段之前,字段将保持为未赋值状态,且对象不可用。
 
2、继承性
结构:不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的Sealed申明,可是结构是隐式的Sealded;
类:完全可扩展,除非显示的申明Sealed,否则类可以继承其他类和接口,自身也可以被继承;
注:虽然结构不能被继承,可是结构能够继承接口,方式和类继承接口一样。
 
3、内部构造
结构:
没有默认的构造函数,但是可以添加带参数(结构不能添加不带任何参数的构造函数)的构造函数;
没有析构函数;
没有abstract和sealed(因为不能继承);
没有portected修饰符,因为结构不能被继承;
可以不使用new 初始化;(例如:Struct A; A.Property = tempA;)
在结构中初始化实例字段是错误的;
(例如:Struct B
{
public P1=1; //Error,Initial Values not Allowed.
public p2;
}
)
 
类:
有默认的构造函数;有析构函数;可以使用abstract和sealed;有protected修饰符;
必须使用new关键字初始化(静态类除外)
 
总结:如何选择结构还是类