C#中的值类型与引用类型-译自《Essential C# 4

系统 2396 0

一、值类型

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

如下图:

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

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

二、变量类型

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

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

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

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

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

附:

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

邀月注:本文版权由邀月和CSDN共同所有,转载请注明出处。
助人等于自助! 3w@live.cn

C#中的值类型与引用类型-译自《Essential C# 4.0》


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论