C#详解值类型和引用类型区别

值类型和引用类型的区别

值类型

包括byte,short,int,long,float,double,decimal,char,bool 和 struct ,枚举,可空类型。
值类型变量声明后,不管是否已经赋值,编译器为其分配内存;

引用类型

包括string 和 class,数组,接口,委托,object。
当声明一个类时,只在栈中分配一小片内存用于容纳一个地址,而此时并没有为其分配堆上的内存空间。
当使用 new 创建一个类的实例时,分配堆上的内存空间,并把堆上空间的地址保存到栈上分配的小片空间中。

这里写图片描述

需要注意的是:引 用类型和值类型都继承自System.Object类。不同的是,几乎所有的引用类型都直接从System.Object继承,而值类型则继承其子类System.ValueType。System.ValueType直接派生于System.Object。即System.ValueType本身是一个类类型,而不是值类型。其关键在于ValueType重写了Equals()方法,从而对值类型按照实例的值来比较,而不是引用地址来比较。可以用Type.IsValueType属性来判断一个类型是否为值类型。

值类型和引用类型的区别总结:

  1. 相同点:
    引用类型可以实现接口,值类型当中的结构体也可以实现接口;
    引用类型和值类型都继承自System.Object类。

  2. 不同点:
    1)范围
    C#的值类型包括:结构体(数值类型、bool型、用户自定义的结构体),枚举,可空类型。
    C#的引用类型包括:数组,用户自定义的类、接口、委托,object,字符串。
    2)内存分配:
    数组的元素不管是引用类型还是值类型,都存储在托管堆上。
    引用类型在栈中存储一个引用,其实际的存储位置位于托管堆。简称引用类型部署在托管推上。而值类型总是分配在它声明的地方:作为字段时,跟随其所属的变量(实 例)存储;作为局部变量时,存储在栈上。(栈的内存是自动释放的,堆内存是.NET中会由GC来自动释放)

    3)适用场合
    值类型在内存管理方面具有更好的效率,并且不支持多态,适合用做存储数据的载体;引用类型支持多态,适合用于定义应用程序的行为。

    3.1.引用类型可以派生出新的类型,而值类型不能,因为所有的值类型都是密封(seal)的;
    3.2.引用类型可以包含null值,值类型不能(可空类型功能允许将 null 赋给值类型,如int? a = null;);
    3.3.引用类型变量的赋值只复制对对象的引用,而不复制对象本身。而将一个值类型变量赋给另一个值类型变量时,将复制包含的值。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值