探索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 MVC5+EF6+LayUI实战教程,通用后台管理系统框架(7)- EF增删改查
前言 上一节创建了实体数据库,这次我们来看看怎么操作这个实体 代码实现 新建一个UserInfoController的控制器:不需要写什么代码,系统自动生成Index方法: 创建IDAL,DAL,IB ...
- css span宽度和css span高度成功设置经验篇
我们介绍两种情况下的对span宽度高度样式成功设置. 为了观察和实践CSS SPAN宽度和span高度成功设置,DIVCSS5新建一个css命名为“.divcss5”的盒子,设置css宽度为150px ...
- 推箱子 (hdu1254)(bfs双重广搜)
推箱子 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission ...
- 【JavaFx教程】第二部分:Model 和 TableView
第二部分的主题 创建一个 模型 类. 在 ObservableList 使用模型类. 使用 Controllers 在 TableView 上显示数据. 创建 模型 类. 我们需要一个模型类来保存联系 ...
- JS中的倒计时
一.注:一般倒计时的时间都是后台传来的然后渲染到页面,这里有2个简单的倒计时方式 //带天数的倒计时function countDown(times){ var timer=null; timer=s ...
- jdk源码->并发->Unsafe&Atomic
synchronized关键字类似于java中的悲观锁机制,接下来介绍一种java的乐观锁机制Unsafe类 CAS CAS简介 CAS全称是Compare And Swap,即比较交换,它是在并发执 ...
- 伯克利开源 Confluo,吞吐量是 Kafka 的 4 到 10 倍
近日伯克利 RISE Lab 开源了一个多数据流实时分布式分析系统 Confluo,它既是一个网络监控和诊断框架,也可以作为时序数据库和发布订阅消息系统. 源码地址:https://github.co ...
- Python面试题都在这里了
转自武沛齐博客:http://www.cnblog.com/wupeiqi/ 第一部分 Python基础篇(80题) 为什么学习Python? 通过什么途径学习的Python? Python和Java ...
- 【代码笔记】iOS-使用MD5加密
一,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, ...
- java发起HTTP请求的共用类
一定要注意编码,请求时,content-type里的编码,仅仅是流的编码,而结果的编码类型,则是流转化为字符串是需要设定的. 以下是3种使用get/post的方式: import java.io.Bu ...