MSDN 中明确指出 String 是引用类型而不是值类型,但 String 表面上用起来却像是值类型,这又是什么原因呢? 
首先从下面这个例子入手:

    //值类型int a = 1;int b = a;a = 2;Console.WriteLine("a is {0},b is {1}", a, b);//引用类型string str1 = "ab";string str2 = str1;str1 = "abc";Console.WriteLine("str1 is {0},str2 is {1}", str1, str2);Console.Read();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

输出结果:

   //结果://a is 2,b is 1//str1 is abc,str2 is ab
  • 1
  • 2
  • 3

从运行结果可以看出:str2 的值还是 ab ,并没有随着 str1 值的改变而改变。如果string是引用类型,按理Str1和Str指针都指向同一内存地址,如果Str的内容发生改变,Str1应该也会相应变化。此例子,看着string更像是值类型。 但是MSDN却说String是引用类型。究其原因,是因为string对象是不可变的,包括长度和其中任何字符都是不可以改变的。

String的不变性

string 对象称为不可变的(只读),因为一旦创建了该对象,就不能修改该对象的值。有的时候看来似乎修改了,实际是string经过了特殊处理,每次改变值时都会建立一个新的string对象,变量会指向这个新的对象,而原来的还是指向原来的对象,所以不会改变。这也是string效率低下的原因。如果经常改变string的值则应该使用StringBuilder而不使用string。

在例子中str1=”ab”,这时在内存中就将“ab”存下来,如果再创建字符串对象,其值也等于“ab”,str2=”ab”,则并非再重新分配内存空间,而是将之前保存的“ab”的地址赋给str2的引用,这就能印证例子2中的结果。而当str1=”abc”其值发生改变时,这时检查内存,发现不存在此字符串,则重新分配内存空间,存储“abc”,并将其地址赋给str1,而str2依然指向“ab”的地址。可以印证例子中的结果。

结论

String是引用类型,只是编译器对其做了特殊处理。

String到底是值类型还是引用类型(C#)相关推荐

  1. C#值类型和引用类型的不同

    1 C#中有两种类型:   值类型和引用类型:      值类型的变量直接包含他们的数据,引用类型存储对他们的数据的引用,后者称为对象:      简单说:值类型直接存储其值,引用类型存储对值得引用. ...

  2. C#-老生常谈的 值类型与引用类型

    特殊的String 说起值类型和引用类型,大家都知道这么个事,很多时候我们会拿String做值类型来做比较,但实际上String虽然是值类型,却表现的有点特别 String示例 看下面的一个例子: 话 ...

  3. string 是值类型,还是引用类型(.net)

    一. string 类型的用法比较像值类型 稍微有点.NET 编程知识的人都知道 string是引用类型.我为什么还有此一问?因为string的使用非常像值类型.举个例子: string str = ...

  4. string:值类型?引用类型?[转]

    string是一种很特殊的数据类型,它既是基元类型又是引用类型,在编译以及运行时,.Net都对它做了一些优化工作,正式这些优化工作有时会迷惑编程人员,使string看起来难以琢磨,这篇文章分上下两章, ...

  5. swift string转int_swift中结构体和类的区别(值类型和引用类型的区别)

    在swift中结构体和类有着更多的相同之处,在一般的使用中能够做到互相替换.我们可以先看看官方文档的描述: Unlike other programming languages, Swift does ...

  6. String 是值类型还是引用类型

    System.String继承自System.Object的一个子类,所有直接或简介继承自System .ValueType的类型属于值类型,这是判断值类型与引用类型的标准. string属于引用类型 ...

  7. .NET六大剑客:栈、堆、值类型、引用类型、装箱和拆箱

    .NET六大剑客:栈.堆.值类型.引用类型.装箱和拆箱 一."堆","栈"专区 这两个字我相信大家太熟悉了,甚至于米饭是什么?不知道..."堆&quo ...

  8. base.dispose(disposing) 未将对象引用到实例_程序员深入理解asp.net c#值类型和引用类型...

    基本概念 CLR支持两种类型:值类型和引用类型. 面试过很多5年左右的同学,有很多连值类型和引用类型的基本概念都回答不上来,难道现在的c#开发人员基础这么弱了吗?还是大家都不重视基础呢?这个随便找一篇 ...

  9. 值类型与引用类型比较与区别

    在.NET中或许我们不用担心内存管理以及垃圾回收器(Garbage Collection GC)的问题,但是我们还是应该了解这些东东以便在必要的时候优化我们程序的性能.而且,如果对内存管理如何工作有所 ...

最新文章

  1. 最新调查,48%的美国人表示不会乘坐自动驾驶汽车
  2. 《Head First Python》第六章--定制数据对象
  3. 我用 Python 破解了同事的加密压缩包!
  4. LINUX下的FTP服务器
  5. Abp vNext swagger注释
  6. 空调库存创新高,格力计划挖掘三四五线城市
  7. SQL练习(less-3)字符型注入 union联合查询
  8. 在Mac上使用中国银行和工商银行网银
  9. win7 mysql 管理员权限,win7管理员权限问题 TrustInstaller 获取权限
  10. 乒乓球发旋转球的关键是什么?
  11. snmp v3 参数_snmp v3的安全配置 snmp认证与加密配置(53)
  12. Jenkins Git Changelog Plugin
  13. CF375C Circling Round Treasures(BFS+DP)
  14. execve 执行遇到的问题-已解决
  15. cloudflare免费证书_使用百度云加速免费加速你的博客
  16. stack-es-标准篇-ElasticsearchClient-fields
  17. python中幂运算的符号是什么_SymPy 符号计算基本教程
  18. 高等数学五-补充1-三角函数定积分
  19. 使用 EMQ X Neuron 构建基于 Modbus 的 IIoT 应用
  20. 安卓恶意软件检测论文内容整理

热门文章

  1. 评分怎么读_英国留学本科中途被退学怎么申请硕士补救
  2. linux查看通信延迟,低优先级进程延迟实时进程中的串行通信(Linux)
  3. 句柄 matlab_matlab 整车仿真
  4. amp 显示成转义字符 in html,如何在HTML标签中转换转义字符?(How to convert escape characters in HTML tags?)...
  5. 基于python的人脸识别技术_用Python写个简单但强大的人脸识别系统
  6. 如何测试一个财务软件系统,对比测试工具平台让财务测试飞起来
  7. ios fixed定位后内容不显示_HTMLCSS学习笔记(七)-- 定位与锚点
  8. linux的yun命令是访问互联网,如何在Linux终端中知道你的公有IP?
  9. 更新鸿蒙系统运行评价,全球首批!升级使用鸿蒙OS真实反馈评价出炉:差评/好评都很真实...
  10. flutter图片预览_Flutter 视频缩略图