为了账号安全,请及时绑定邮箱和手机立即绑定

C#中的值类型与引用类型

标签:
C#

一、值类型

  除去string外,所有的预定义基础类型都是值类型。值类型直接包含值。换句话说,该变量指向内存中存储(变量)值的同一地址。
正因为如此,当一个不同的变量被分配了相同的值,原始变量的值的内存副本改变到新的变量的地址。一个相同值类型的第二个变量不能指向内存中的第一个变量相同的地址。因此,改变了第一个变量的值不会影响到第二个值。

  如下图:

https://img1.sycdn.imooc.com//5ad47a2c0001bbaa06690204.jpg

  如上图,number1指向包含值42的内存中的特殊地址,将number1分配给number2后,这两个变量都包含值42。然而,修改任何一个变量的值不影响另外一个。

  类似地,传递一个值类型到一个方法(类如Console.WriteLine())会导致内存复制,方法中参数的任何改变不会影响调用函数范围内的原始值。因为值类型需要一个内存复制,通常它们应当被定义为小额内存开销(小于16字节)

二、引用类型

  引用类型和引用它们的变量指向数据存储地址。引用类型存储了数据存储地址的引用,而不是直接存储数据。因此,访问数据时,运行时将读取(引用变量的)内存位置,并跳到包含数据的内存地址。一个引用类型指向的数据内存区域是一个Heap(堆),如下图

https://img1.sycdn.imooc.com//5ad47a380001623706680665.jpg

  一个引用类型并不像值类型那样需要数据的相同的内存副本,后者效率更高但会导致一些问题。当把一个引用类型的变量值赋给另外一个引用类型变量时,仅有一次地址的内存复制发生,因此,引用类型需要的内存复本总是内存地址本身大小(32位处理器复制32bit,64位处理器复制64bit)。

  显然,不复制数据将比值类型的(复制)快一些,特别是后者的数据较庞大时。由于引用类型仅仅复制数据的地址,两个不同的变量能指向相同的数据,通过一个变量改变数据将改变另一个变量。在赋值或方法调用时均如此。因此,一个方法会影响引用类型的数据并返回给调用者。由于这个原因,选择定义一个变量为值类型还是引用类型的决定性因素是该对象是否在逻辑上是一样的大小不变的固定值,如果是,则值类型。

  string,自定义的类属于引用类型。

--邀月译自《Essential C# 4.0》

附:

值类型:基础数据类型(整型、布尔型、字符型、实数型)、结构型、枚举型。
引用类型:类、对象、string、数组、接口、委托。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消