一、C#中的字符串在内存中的驻留机制:
正如http://kb.cnblogs.com/page/102225/中所言, 当有多个字符串变量包含了同样的字符串实际值时,CLR可能不会为它们重复地分配内存,而是让它们统统指向同一个字符串对象实例。
为了实现这个机制,CLR默默地维护了一个叫做驻留池(Intern Pool)的表。这个表记录了所有在代码中使用【字面量声明】的字符串实例的引用。这说明使用字面量声明的字符串会进入驻留池,而其他方式声明的字符串并不会进入,也就不会自动享受到CLR防止字符串冗余的机制的好处了。
二、C#中对于字符串以下几个声明:
- string myString;
- string myString = String.Empty;
- string myString = "";
以上的声明和后续字符串的使用,究竟有什么不同?
一开始看了http://www.cnblogs.com/ayajenson/articles/1173155.html 和http://www.oschina.net/question/163917_24317,我以为string.Empty 不分配存储空间,"" 分配一个长度为空的存储空间。后来看了http://www.bitscn.com/pdb/dotnet/201003/181883.html,此链接图文并茂,比较可靠。
总结几点内容如下:
1、string myString:只定义myString,系统默认为myString赋值为null,但myString并没有指向任何内存地址,在应用前若不实例化,编译器将会报错;
2、string myString = string.Empty:定义并同时初始化myString,同时在栈上保存一个地址(占4字节),这个地址指向内存堆中的某个长度为0的空间,这个空间保存的是string.Empty的实际值;
3、string myString = "":“”与string.Empty在用法与性能上基本没区别。string.Empty是在语法级别对””的优化。在 C# 中,大多数情况下"" 和 string.Empty 可以互换使用。
实际使用中,string
myString=null
较多使用,因为null的指定更利于垃圾回收。
若要测试字符串的值是否为null 或String.Empty,可以使用IsNullOrEmpty 方法。