【C#】class与struct的区别



    class和struct语法几乎相同,但其本质却截然不同:class是引用类型,struct是值类型,也就是说在内存中存储方式有别,由此产生的一系列差异性。

    class(类)是面向对象编程的基本概念,是一种自定义数据结构类型,通常包含字段、属性、方法、构造函数、索引器、事件等。在.NET中,所有的类都继承自System.Object类,是一种引用类型,也就是说,当我们new出一个类的实例时,对象保存了该实例实际数据的引用地址,而对象的值保存在托管堆中。



    struct(结构)是一种值类型,用于将一组相关的信息变量组织成为一个单一的变量实体。所有的结构都继承自System.ValueType类,是一种值类型,我们可以像使用int和char一样去使用struct。struct实例分配在线程的堆栈上,它本身存储了值,而不是指向该值的指针。

    了解了class和struct的本质,我们可以通过分析和实验来总结二者的区别:

    (1)关于实质:class是引用类型,struct是值类型

    (2)关于职能:class是行为的封装,用来表述对象,而struct是数据的封装,用来储存数据

    (3)关于继承:class支持继承自类和接口;而struct只能支继承接口。struct不能从class继承,也不能作为class的基类。

    (4)关于构造函数:class可以声明无参构造函数,可以声明析构函数;而struct只能声明带参数构造函数,且不能声明析构函数。

    (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的比较有Equals和==两种,即值相等和引用相同;而两个struct可以直接通过==来判断。

    (9)关于销毁:class实例由垃圾回收机制来保证内存的回收处理;而struct变量使用完后立即自动解除内存分配。

    (10)关于参数传递:class变量是以按址方式传递;而struct变量是以按值方式传递的。

    既然class几乎可以完全替代struct来实现所有的功能,那么struct还有存在的必要吗?至少在以下情况下,我们应该考虑使用struct来代替class:

    1. 实现一个用于存储数据的结构时,可以考虑struct。
    2. 考虑与某些非托管代码通信的兼容性问题时,可以考虑struct。

    原文:NET中class与struct的区别简析

    P.S. 附一篇《C#中虚函数和抽象函数的区别



    本博客所有文章如无特别注明均为原创。
    复制或转载请以超链接形式注明转自枫芸志,原文地址《【C#】class与struct的区别
    标签:
    分享:

已经有3 条评论抢在你前面了~

  1. 沙发
    陌凡 2012年1月15日 上午4:29

    学习哦,营养贴,呵呵

    [回复]

  2. 板凳
    Louis Han 2012年1月13日 下午12:32

    这几天我也在仔细研读这些东西 什么重载重写啊虚函数抽象函数

    [回复]

    晴枫

    晴枫 回复:

    @Louis Han, 都是些很基础的东西,面向对象必知

    [回复]

无觅相关文章插件,快速提升流量