C#学习之结构与类的区别

80酷酷网    80kuku.com

  区别最近有看到网上面试题提到结构鱼类的区别,遂查看了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关键字初始化(静态类除外) 总结:如何选择结构还是类
  讨论了结构与类的相同之处和差别之后,下面讨论如何选择使用结构还是类:

  1.堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些
  2.结构表示如点、矩形和颜色这样的轻量对象,例如,如果声明一个含有 1000 个点对象的数组,则将为引用每个对象分配附加的内存。在此情况下,结构的成本较低。
  3.在表现抽象和多级别的对象层次时,类是最好的选择
  4.大多数情况下该类型只是一些数据时,结构时最佳的选择 参考:1、http://www.chinaitpower.com/A/2004-10-20/136449.html          2、《C#高级编程(第4)》

分享到
  • 微信分享
  • 新浪微博
  • QQ好友
  • QQ空间
点击: