A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨廉壬 中级黑马   /  2012-3-12 15:52  /  2387 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

C# 中 Struct 与 Class 的区别,以及两者的适用场合

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

3 个回复

倒序浏览
Class是面向对象编程的基本概念,是一种自己定义数据类型,是一种引用类型,一般包括属性、方法、属性、构造函数、索引器、操作符等。
Struct是一种值类型,用于将一组相关的信息变量组织为一个单一的变量实体。
Class和Struct的区别:
1、  class是引用类型,继承自System.Object类;struct是值类型,继承自System.ValueType类,因此不具多态性。但是注意,System.ValueType是个引用类型。
2、从职能观点来看,class表现为行为;而struct常用于存储数据。
3、class支持继承,可以继承自类和接口;而struct没有继承性,struct不能从class继承,也不能作为class的基类,但struct支持接口继承。
4、class可以声明无参构造函数,可以声明析构函数;而struct只能声明带参数构造函数,且不能声明析构函数。因此,struct没有自定义的默认无参构造函数,默认无参构造器只是简单地把所有值初始化为它们的0等价值。
5、实例化时,class要使用new关键字;而struct可以不使用new关键字,struct在声明时就进行了初始化过程,所有的成员变量均默认为0或null。
6、class可以实抽象类(abstract),可以声明抽象函数;而struct为抽象,也不能声明抽象函数。
7、class可以声明protected成员、virtual成员、sealed成员和override成员;而struct不可以,但是值得注意的是,struct可以重载System.Object的3个虚方法,Equals()、ToString()和GetHashTable()。
8、class的对象复制分为浅拷贝和深拷贝,必须经过特别的方法来完成复制;而struct创建的对象复制简单,可以直接以等号连接即可。
9、class实例由垃圾回收机制来保证内存的回收处理;而struct变量使用完后立即自动解除内存分配。
10、作为参数传递时,class变量是以按址方式传递;而struct变量是以按值方式传递的。

收集的可能不全,楼下的补充完整吧,嘿嘿
回复 使用道具 举报
  1. 值类型与引用类型

  结构是值类型:值类型在堆栈上分配地址,所有的基类型都是结构类型,例如:int 对应System.int32 结构,string 对应 system.string 结构 ,通过使用结构可以创建更多的值类型

  类是引用类型:引用类型在堆上分配地址

  堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑复杂的对象。所以结构处理作为基类型对待的小对象,而类处理某个商业逻辑

  因为结构是值类型所以结构之间的赋值可以创建新的结构,而类是引用类型,类之间的赋值只是复制引用

  注:

       1.虽然结构与类的类型不一样,可是他们的基类型都是对象(object),c#中所有类型的基类型都是object

       2.虽然结构的初始化也使用了New 操作符可是结构对象依然分配在堆栈上而不是堆上,如果不使用“新建”(new),那么在初始化所有字段之前,字段将保持未赋值状态,且对象不可用

  2.继承性

  结构:不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用sealed声明,可是结构是隐式的sealed .

  类:完全可扩展的,除非显示的声明sealed 否则类可以继承其他类和接口,自身也能被继承

  注:虽然结构不能被继承 可是结构能够继承接口,方法和类继承接口一样

  例如:结构实现接口
  1.   interface IImage  

  2.   {

  3.   void Paint();

  4.   }
  5.   

  6.   struct Picture : IImage

  7.   {

  8.   public void Paint()

  9.   {

  10.   // painting code goes here

  11.   }

  12.   private int x, y, z; // other struct members

  13.   }
复制代码
  

  3.内部结构:

  结构:

  没有默认的构造函数,但是可以添加构造函数

  没有析构函数

  没有 abstract 和 sealed(因为不能继承)

  不能有protected 修饰符

  可以不使用new 初始化

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

  类:

  有默认的构造函数

  有析构函数

  可以使用 abstract 和 sealed

  有protected 修饰符

  必须使用new 初始化   



如何选择结构还是类???


  1. 堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些

  2. 结构表示如点、矩形和颜色这样的轻量对象,例如,如果声明一个含有 1000 个点对象的数组,则将为引用每个对象分配附加的内存。在此情况下,结构的成本较低。

  3. 在表现抽象和多级别的对象层次时,类是最好的选择

  4. 大多数情况下该类型只是一些数据时,结构时最佳的选择
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马