美文网首页程序员
值类型 VS 引用类型

值类型 VS 引用类型

作者: MoZhou | 来源:发表于2016-11-20 23:29 被阅读166次

    如果把系统比做是个银行,那么值类型相当于现金,要用直接用;引用类型是存折,要用时得先去银行取现。

    值类型和引用类型都继承自System.Object类。不同之处是几乎所有的引用类型都是直接从System.Object继承,而值类型则是继承System.Object的子类System.ValueType类

    1.什么是值类型?

    直接存储数据,多用于存储不经常改变的值。数据存储在栈上,只存储变量的值。一般存储在栈上。所有的值类型都是seal的,不能被继承。

    int i = 10;
    int b = i;
    

    CLR会先在栈上给i分配内存空间,然后把10存到这个空间里。然后在栈上给b分配内存空间,然后把i的值10copy 到分配给b的内存空间里。

    2.值类型有哪些类别?

    • 简单类型 :有符号整型,无符号整型,字符类型,浮点类型,布尔类型
    • 枚举类型 :enum
    • 结构体类型 :struct

    3.什么是引用类型?

    存储数据的引用(内存地址),数据存储在堆中

    A ref;//声明类
    A a = new A()//实例化类
    

    声明一个类时,CLR只会在栈中分配一小块内存用于存放地址,并没有为其分配堆上的内存空间。

    new操作符返回对象的内存地址(即指向对象数据的内存地址)所以实例化一个类时,CLR会为实例分配堆上的空间,并且会把该实例堆上空间的地址保存到栈上为a分配的内存空间中。

    4.引用类型有哪些类别?

    • 类类型 : string / class
    • 数组类型
    • 接口类型
    • 委托类型

    5.为什么要有值类型?

    为了用来存储基本的生命周期比较短不经常被改变的值数据,直接操作内存,查找起来比较方便,减小系统开销。

    6.为什么要有引用类型?

    存储得是对象的内存地址,需要先解析引用地址才能拿到对象。但是可以直接操作同一对象,不会像值类型一样每次都分配内存空间消耗内存。

    7.生命周期什么时候结束?

    • 值类型 :离开函数体会被销毁
    • 引用类型 :没有被引用的地方时

    8.GC什么时候回收?

    当生命周期结束后,GC会统一回收

    9.为什么值类型继承System.ValueType类却不是引用类型?

    System.ValueType本身是一个引用类型,由于它重写了Equals()方法,所以对值类型按照实例的值来比较,而不是引用地址来比较。

    相关文章

      网友评论

        本文标题:值类型 VS 引用类型

        本文链接:https://www.haomeiwen.com/subject/mggypttx.html