在没有class的面向过程的编程时代,struct是封装数据的利器,没它不行。但自从面向对象编程以来,class横空出世,大家高呼着“万事万物皆对象”,把class含在嘴里,握在手里,基本上使用class可以替代struct的任何场合。但是各位不要忘了“存在必有其价值”,所以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:

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

所有这些是struct有一席之地的理由,当然也许还有其他的更多说法,只是我不知道罢了。

引用一个经典示例

(1)定义接口

 interface IPerson{void GetSex();}

(2)定义类

public class Person
    {
        public Person()
        {
        }

public Person(string name, int age)
        {
            _name = name;
            _age = age;
        }

private string _name;

public string Name
        {
          get { return _name; }
          set { _name = value; }
        }

private int _age;

public int Age
        {
          get { return _age; }
          set { _age = value; }
        }
    }

(3)定义结构

//可以继承自接口,不可继承类或结构
    struct Family: IPerson
    {
        public string name;
        public int age;
        public bool sex;
        public string country;
        public Person person;

//不可以包含显式的无参构造函数和析构函数
        public Family(string name, int age,

bool sex, string country, Person person)
        {
            this.name = name;
            this.age = age;
            this.sex = sex;
            this.country = country;
            this.person = person;
        }

//不可以实现protected、virtual、sealed和override成员
        public void GetSex()
        {
            if (sex)
                Console.WriteLine(person.Name + " is a boy.");
            else
                Console.WriteLine(person.Name + " is a girl.");
        }

public void ShowPerson()
        {
            Console.WriteLine("This is {0} from {1}",

new Person(name, 22).Name, country);
        }

//可以重载ToString虚方法
        public override string ToString()
        {
            return String.Format("{0} is {1}, {2} from {3}",

person.Name, age, sex ? "Boy" : "Girl", country);
        }
    }

本文关于 class和struct的讨论到此为止,在.NET中,关于class和struct的讨论将涉及到对引用类型和值类型的认识,并且进一步将触角伸向变量内存分配这一高级主题,所以我们有必要来了解其运行机制,把握区别和应用场合,以便在平常的系统设计中把握好对这一概念层次的内容。

转载于:https://www.cnblogs.com/tangself/archive/2009/12/10/1621416.html

NET中class与struct的区别简析相关推荐

  1. Python中的基本函数及其常用用法简析

    分享Python中的基本函数及其常用用法简析,首先关于函数的解释函数是为了达到某种目的而采取的行为,函数是可重复使用的,用来实现某个单一功能或者功能片段的代码块,简单来说就是由一系列的程序语句组成的程 ...

  2. Python中匿名函数及递归思想简析(小本本记下来)

    前言: 上次咱们基本说了一下函数的定义及简单使用,想要了解的伙伴可以去看看.Python中最基本的函数及其常用用法简析(新手必备)小本本记起来 现在咱们整点进阶一些的.同样都是小白,咱也不知道实际需要 ...

  3. 中职学校计算机教学背景,简析中职学校计算机课堂有效教学

    简析中职学校计算机课堂有效教学 在计算机教育这一领域,新的技术层出不穷,这在计算机课堂中的有效教学就要有更高的要求,下面是小编整理推荐的一篇计算机有效教学的论文范文,供大家参考. [摘要]在课堂上教给 ...

  4. C++中class与struct的区别

    关于使用大括号初始化class和struct如果定义了构造函数的话,都不能用大括号进行初始化 如果没有定义构造函数,struct可以用大括号初始化. 如果没有定义构造函数,且所有成员变量全是publi ...

  5. JCU中SynchronousQueue、LinkedBlockingQueue、ArrayBlockingQueue简析

    阅读文本大概需要3分钟. 0x01:SynchronousQueue SynchronousQueue是无界的,是一种无缓冲的等待队列,但是由于该Queue本身的特性,在某次添加元素后必须等待其他线程 ...

  6. OpenCV中基本数据类型Mat类使用简析

    Mat 类是OpenCV中的一个基本数据类型,它是一个n维密集数组类 Mat 类表示一个 n 维密集数值单通道或多通道数组.它可用于存储实数或复值向量和矩阵.灰度或彩色图像.体素体积.向量场.点云.张 ...

  7. matlab bar中画显著性水平线,科学网—简析条形图(bar plot)上的误差线 - 于淼的博文...

    经常会遇到有人问条形图上误差线画什么的问题,有人说标准差(sd),有人说标准误(se),有的直接说置信区间(CI),其实这倒也不是什么大问题,你按什么画就在文章中注明就是了.后来看到JCB上有一篇科普 ...

  8. hog函数的用法 python_Python中的基本函数及常用用法简析

    函数 解释 函数是为了达到某种目的而采取的行为,函数是可重复使用的,用来实现某个单一功能或者功能片段的代码块,简单来说就是由一系列的程序语句组成的程序段落. 函数存在的意义: 1. 提高代码的复用性 ...

  9. SAP财务记账中的贸易伙伴Trading Partner简析

    公司也称为贸易伙伴,是出具合并报表的组织单位,可以为客户和供应商分配公司(贸易伙伴),用于识别集团内关闻公司间的业务往来,在编制合并报表时进行往来账务的计算处理. 贸易伙伴在附加条目中显示 子公司与子 ...

最新文章

  1. r15电脑测试软件,Cinebench r15
  2. poj3683 Priest John's Busiest Day
  3. Javascript启动LINUX的x86模拟器
  4. 零基础教你玩转ESP8266(一) 重识ESP8266
  5. BZOJ4001[TJOI2015]概率论(数学、期望、生成函数、卡特兰数)
  6. 【论文研读】【金融】Predicting the direction of stock market prices using random forest
  7. 学习笔记: Django之初见
  8. 狮子鱼社区团购独立版安装方法
  9. 绿云酒店管理系统 服务器要求,绿云宾馆管理软件系统基础-20210728170313.docx-原创力文档...
  10. Spark机器学习(一)—Spark相关
  11. 流程图软件Visio的使用笔记
  12. 在微信上直播的优势有那些
  13. matlab屏保弹球,连续时间下的弹球建模
  14. vue3+typeScript项目运行提示Type string trivially inferred from a string literal, remove type annotatio怎么解决
  15. 【19C】logmnr参考
  16. 智能手环---设计与实现
  17. 在英特尔独立显卡上训练TensorFlow模型
  18. 计算机网络数据通信部分之网络层ARP报文分析
  19. 港中文计算机金融,香港中文大学金融数据分析和风险管理科学硕士专业
  20. 二进制中1的个数——《剑指offer》

热门文章

  1. PHP操作MongoDB学习笔记
  2. weblogic linux sun/awt/X11GraphicsEnvironment
  3. vim默认设置的配置
  4. Typesetting Engine_Gecko
  5. 代码自动生成工具的补充
  6. Java中的几种对象(PO、VO、DAO、BO、POJO)
  7. 天猫精灵 python_python爬天猫
  8. sscanf 实现_中国实现全球首个5G独立组商网,5G还没铺完6G重磅方案已经出台!...
  9. 深入解析 Go 中 Slice 底层实现
  10. kafka专题:kafka的总控制器Controller、消费者重分配策略等核心设计原理详解