- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
HYPERLINK /solan/archive/2012/08/03/CSharp07.html C#基础知识梳理系列七:字符串
摘 要
字符串是保存文本的System.String类型对象。它跟值类型(如:Int32、Int64等)有着相似的使用方法及表达目的,但它并不是值类型。由于在编程中会大量使用字符串,所以CLR为了提高性能及开发方便,对它进行了特殊处理。这一章,我们来介绍一下字符串的驻留机制、字符串池及字符串的比较等特性。
注意,本系列所有测试代码均运行于.NET 4.0。
第一节 字符串的定义(System.String)
字符串被定义为System.String类型的对象,既然它是引用类型,那么一个未初始化的对象声明将保留为null,并且它的内存只能在堆上分配。它在内部维护的是字符Char的集合,所以它有一个属性Length来表示Char集合中元数的个数。来看一下String类型的定义:
String实际上是继承了System.Object类型,同时还实现了一系列接口,如Ienumberable、ICompareable等,所以字符串提供了对字符集合、比较等相关的操作。
尽管它是引用类型,但是编译器不允许使用new根据一个文本常量来创建一个字符串对象,而是必须使用简明的声明语法来声明及初始化,对字符串的初始化值是直接被编译进元数据的。比如如下定义一个字符串变量:
string name1 = Jack;
IL:
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// 代码大小 19 (0x13)
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldstr Jack
IL_0006: stfld string ConsoleApp.Example07.Code_07::name1
IL_000b: ldarg.0
IL_000c: call instance void [mscorlib]System.Object::.ctor()
IL_0011: nop
IL_0012: ret
} // end of method Code_07::.ctor
我们知道,通常对于引用类型创建对象是使用newobj指令,但上面的并没有使用该指令,只是使用ldstr指令加载了字符串“Jack”,从IL_0000 - IL_0006可以看到是直接加载“Jack”串赋给变量,这是CLR的一种特殊的构造方式。
?
第二节 字符串的不可变性
字符串对象一旦创建,在整个进程的生命周期中是不可变的,无法对其进行加长、缩短、改变等操作,既然它不会变,所以也就不存在线程同步的问题,哪怕是皇天老儿创建的线程都无法对其进行改变。如下代码:
string str1 = Jim;
string str2 = str1;
Console.WriteLine(object.ReferenceEquals(str1, str2)); //True
str1 += China;
Console.WriteLine(object.ReferenceEquals(str1, str2)); //False
在第一次调用object.ReferenceEquals方法比较的str1和str2,它们指向的是同一个字符串对象引用,所以结果为true,而str1 += China;的过程是重新创建了一个对象,且把新的对象引用赋给str1,此时str1与str2指向的不是同一个对象引用,所以在第二次调用object.ReferenceEquals方法时返回的是false。无论是使用+=操作符还是其他的对字符串修改的方法,都会引起重新创建字符串对象,并且复制旧的字符串到新的内存区,而不是我们常说的“对XX字符串进行修改”,如果非要说“改变”,那就是对对象引用的改变。对于str1 += China;操作,CLR会执行以下操作:
1) 开辟新的足够大的临时存储区内存来容纳str1和” China”;
2) 复制str1串到临时区的开始处;
3) 复制” China”到临时存储区的结尾处;
4)?str1丢弃对旧对象的引用;
5) 为str1再一次分配内存区;
6) 将临时存储区内的字符值复制到4)新开辟的内存区,将str1指向这个内存区的引用。
所以对字符串的
文档评论(0)