zoukankan      html  css  js  c++  java
  • C#中结构体和类的区别

    结构体和类同样能够定义字段,方法和构造函数,都能实例化对象,这样看来结构体和类的功能好像是一样的了,但是他们在数据的存储上是不一样的

    C#结构体和类的区别问题

    这两种数据类型的本质区别主要是各自指向的内存位置不同。传递类的时候,主要表现为是否同时改变了源对象。

    1.结构体是值类型,类是引用类型

    虽然结构体的初始化也使用了new操作符,可是结构体对象依然分配在堆栈上而不是堆上

    类在传递的时候,传递的内容是位于托管内存中的位置,结构体在传递的时候,传递的内容是位于程序堆栈区的内容。当类的传递对象修改时,将同时修改源对象,而结构体的传递对象修改时,不会对源对象产生影响。

    堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑复杂的对象。所以结构处理作为基类型对待的小对象,而类处理某个商业逻辑 
    因为结构是值类型所以结构之间的赋值可以创建新的结构,而类是引用类型,类之间的赋值只是复制引用 

    注: 
      a.虽然结构与类的类型不一样,可是他们的基类型都是对象(object),c#中所有类型的基类型都是object 
      b.虽然结构的初始化也使用了New 操作符可是结构对象依然分配在堆栈上而不是堆上,如果不使用“新建”(new),那么在初始化所有字段之前,字段将保持未赋值状态,且对象不可用 

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

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

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

    3.结构:不能包含显式默认构造函数;没有析构函数,没有abstract和sealed(因为不能继承);不能有protected修饰符,可以不使用new初始化

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

    类: 有默认的构造函数,有析构函数,可以使用abstract和sealed,有protected修饰符,必须使用new初始化。

    如何选择用结构还是类 

    讨论了结构与类的相同之处和差别之后,下面讨论如何选择使用结构还是类: 
    1. 堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些 
    2. 结构表示如点、矩形和颜色这样的轻量对象,例如,如果声明一个含有 1000 个点对象的数组,则将为引用每个对象分配附加的内存。在此情况下,结构的成本较低。 
    3. 在表现抽象和多级别的对象层次时,类是最好的选择
    4. 大多数情况下该类型只是一些数据时,结构时最佳的选择

    作者:耑新新,发布于  博客园

    转载请注明出处,欢迎邮件交流:zhuanxinxin@aliyun.com

  • 相关阅读:
    永久破解之phpstorm
    CPU线程和Java线程
    kvm自动扩容内存
    swoole http server 信息
    mac 安装PHP redis扩展phpredi-5.0.2
    el-tree,很恶心的树,就从默认展开节点开始吧
    转开发啦,就从最基础的数据转换开始吧
    Java集合系列-HashSet
    Java基础系列-单例的7种写法
    Java基础系列-Lambda
  • 原文地址:https://www.cnblogs.com/Arthurian/p/5738458.html
Copyright © 2011-2022 走看看