探索C#字符串
一、前言
刚接触C#时,书上说string是一种特殊的引用类型,因此string类型变量在作为参数传递到另一个方法,被修改后原变量的值不会发生变化,当时看得我一脸懵逼,什么叫特殊...。后来又听说字符串是不可变的(immutable),也就是说字符串一经创建便不能更改。今天就来探究一下所谓的特殊到底特殊在哪里,借助的手段是通过VS及时窗口查看变量堆栈地址(&VariableName).
二、字符串特性
- 引用类型的字符串
C#中我们都知道,引用类型是分配在堆上的,值类型分配在栈上,但引用类型的地址分配在栈上。字符串作为一种“特殊”的引用类型,并不会因为它的特殊性,将它分配到栈上去,它依旧在堆上. - 字符串池
编译器编译源码时,会将字面值字符串嵌入到托管模块的元数据中,为了减小文件大小,编译器只在模块元数据中将该字符串写入一次,引用该字符串的代码全都指向同一位置,因此一个程序中相同的字面值字符串只会存在一个实例.
- 字符串留用
前面说到,一个程序相同的字面值字符串只会存在一个实例,那么非字面值字符串也会只有一个实例吗?
由上图可以看出,相同的非字面值字符串堆地址是不一样的,若想只存在一个副本可通过暂存池(如果应用程序不在保持对原始字符串的引用,GC就可释放那个字符串的内存),详情请看NSDN:String.Intern
- 字符串的不可变性
字符串是不可变更的,若发生变化则创建新的实例。从下图可看出,变量str加上字面值字符串“a”之后,变量str指向的堆地址发生了变化。
- “特殊”的字符串
字符串是一种“特殊”的引用类型,在作为参数传递被修改后原始字符串不发生变化
从上图可以看出,strValue跟mStrValue的堆地址是一致的,也就是说字符串传参跟普通引用类型传参是一样的,都是传入的引用地址。那么问题来了,既然地址都传进去了,为什么字符串修改后原字符串不发生变化呢?原因就在上一条,字符串的不可变性,当方法中的字符串变量值发生变化后,字符串变量将会指向一个新的地址,原地址的值不变,因此原字符串的值不会发生变化。
探索C#字符串的更多相关文章
- Qt5字符串编码转换学习
目录 1.通过Python3示例探索常用字符串编码 UTF8 ANSI Unicode 小结 2.Qt5中使用QTextCodec进行编码转换 小结 1.通过Python3示例探索常用字符串编码 下面 ...
- PHP内核探索之变量(7)- 不平凡的字符串
切,一个字符串有什么好研究的. 别这么说,看过<平凡的世界>么,平凡的字符串也可以有不平凡的故事.试看: (1) 在C语言中,strlen计算字符串的时间复杂度是?PHP中呢? ...
- C# 字符串拼接性能探索
本文通过ANTS Memory Profiler工具探索c#中+.string.Concat.string.Format.StringBuilder.Append四种方式进行字符串拼接时的性能. 本文 ...
- C# 字符串拼接性能探索 c#中+、string.Concat、string.Format、StringBuilder.Append四种方式进行字符串拼接时的性能
本文通过ANTS Memory Profiler工具探索c#中+.string.Concat.string.Format.StringBuilder.Append四种方式进行字符串拼接时的性能. 本文 ...
- 对上次“对字符串进行简单的字符数字统计 探索java中的List功能 ”程序,面向对象的改进
之前的随笔中的程序在思考后发现,运用了太多的static 函数,没有将面向对象的思想融入,于是做出了一下修改: import java.util.ArrayList; import java.util ...
- 对字符串进行简单的字符数字统计 探索java中的List功能
题目: 统计一个字符串中数字和字符串的个数,并分别进行排列,要求 1.数字,字符串可以从键盘获取. 2.储存在list 3.统计数字个数,字符串个数 4.把数字和字符串按从小到大的顺序输出 5.不能使 ...
- 【C语言探索之旅】 第二部分第四课:字符串
内容简介 1.课程大纲 2.第二部分第四课: 字符串 3.第二部分第五课预告: 预处理 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏. ...
- Java探索之旅(13)——字符串类String
1.初始化 String类是Java预定义类,非基本类型而是引用类型. public class StudyString { public static void main(String[] args ...
- Java探索之旅(10)——数组线性表ArrayList和字符串生成器StringBuffer/StringBuilder
1.数组线性表ArrayList 数组一旦定义则不可改变大小.ArrayList可以不限定个数的存储对象.添加,插入,删除,查找比较数组更加容易.可以直接使用引用类型变量名输出,相当于toString ...
随机推荐
- ASP.NET MVC的ContentResult
ASP.NET MVC的ContentResult返回简单的纯文本内容,可通过ContentType属性指定应答文档类型,通过ContentEncoding属性指定应答文档的字符编码. 一个例子来演习 ...
- webpack与gulp的区别
gulp是工具链.构建工具,可以配合各种插件做js压缩,css压缩,less编译 替代手工实现自动化工作 1.构建工具 2.自动化 3.提高效率用 webpack是文件打包工具,可以把项目的各种js. ...
- 自动生成编号(B开头后跟6位,数据库查询不重复)
private string GetAccountNo() { try { string shortName="B"; "; //查询数据库 7位且包含“B” & ...
- SpringBoot整合Druid数据连接池
SpringBoot整合Druid数据连接池 Druid是什么? Druid是Alibaba开源的的数据库连接池.Druid能够提供强大的监控和扩展功能. 在哪里下载druid maven中央仓库: ...
- java项目运用server运行(eclipse、myeclipse通用)
右键点击”new“选择“Other”,打开选项 勾选”Show All Wizards“ 然后在搜索处输入server,选择server,点击next 刚进来时此处都是空的,点击Configure r ...
- Number Sequence(hdu4390)
Number Sequence Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tot ...
- 猜生日 Java小游戏
最近看到一个很有趣的小游戏: 询问朋友5个问题,找到他出生在一个月的哪一天.每个问题都是询问他的生日是否是5个数字集合中的一个. 这5个集合分别是: set1:1 3 5 7 9 11 13 15 1 ...
- 理解Java异常
一.Java异常的简介 Java异常是Java提供的一种识别及响应错误的一致性机制.具体来说,异常机制提供了程序退出的安全通道.当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器.Ja ...
- pycharm虚拟环境
pycharm虚拟环境 1. 选择一个本地的空目录,---该目录就作为python虚拟环境目录, 2. 选择本地python安装目录: 3. 勾选该选项后则可以使用base interpreter中的 ...
- CentOS7部署Django项目
1. 云服务器 这里使用的是腾讯云选择系统:CentOS7.3 记住云服务器登录密码 2. 配置Python3环境 默认Python环境为python2.7,yum安装是需要python2的环境的 安 ...