1、查阅资料,了解C#中的字符串在内存中的驻留机制;
2、查阅资料,了解C#中对于字符串以下几个声明:
- string myString;
- string myString = String.Empty;
- string myString = "";
以上的声明和后续字符串的使用,究竟有什么不同?
3、据说判断一个字符串的内容是否为空,采用if(0 == myString.Length)的速度是最快的(比if("" == myString) 要快),查阅相关资料,设计一下对应的对比实验。
4、可结合防伪码实验,对比一下,是否运行多次程序后,字符串生成速度会有提高?可设计对应的对比实验。
5、阅读此文章:C#基础知识梳理系列七:字符串,http://www.cnblogs.com/solan/archive/2012/08/03/CSharp07.html
(1) C#中的字符串在内存中的驻留机
文章http://www.cnblogs.com/instance/archive/2011/05/24/2056091.html
感觉c#的字符串机制和java基本一样
有三个点需要说:(a)当有多个字符串变量包含了同样的字符串实际值时,CLR不会为它们重复地分配内存,而是让它们统统指向同一个字符串对象实例。(b) s1,s2表示的是相同的字符串,但是由于s2不是通过字面量声明的,CLR在为返回值分配内存时,并不会到驻留池中去检查是否有相同值字符串存在,所以不会让s2指向驻留池内的对象。(3)intern的使用, Intern方法接受一个字符串作为参数,它会在驻留池中检查是否存在参数所表示的字符串。如果存在,则返回那个驻留池中的字符串的引用;否则向驻留池中加入一个新的表示相同值的字符串,并返回这个字符串的引用。
(2) C#中对于字符串的比较:http://www.bitscn.com/pdb/dotnet/201003/181883.html
stringmyString; myString赋值为null, 会在栈上保存一个地址,这个地址也占4字节,但是这个地址是没有明确指向的,它哪也不指
stringmyString = ""; 这时会在栈上保存一个地址,这个地址占4字节,指向内存堆中的某个长度为0的空间,这个空间保存的是mystring的实际值。
另外要说的是""与string.Empty的关系,其实内部实现是一样的。实际上Empty是string类中的一个静态的只读字段,他的定义是这样的:public static readonly String Empty = "";有人说string.Empty 不分配存储空间,这时错误的。其实和myString=""是一样的。