String与StringBuilder

 

String特性:

 

1、编译器将文本常量字符串放在托管模块的元数据中,然后在运行时使用一种称作字符串驻留(string interning)的机制来访问。

 

2、C#中不能用new操作符来创建String对象。例如:

 

String str = new String("Hello"); 将产生编译错误。

 

正确的创建方式是:

 

String str = "Hello";

 

3、对于所有字符串都是文本常量的字符串用+连接符操作时,编译器会在编译时就将它们连接为一个字符串,并只将连接后的字符串放在生成模块的元数据中。对那些不是文本常量的字符串用+连接符将使连接操作在运行时执行,这时候建议大家不要使用+操作符,因为它会在托管堆上创建多个字符串对象,相反应该使用StringBuilder。

 

4、字符串具有恒定性:一个字符串一旦被创建,我们就不能再将其变长、变短、或者改变其中的字符。任何对字符串的改变操作都将产生一个新的字符串。

 

5、字符串在运行时使用字符串驻留机制:CLR初始化时,会创建一个内部的散列表,其中键为字符串,值为指向托管堆中字符串对象的引用。当JIT在编译方法时,会在每一个散列表中查找每一个文本常量字符串,如果没有找到就构造一个新的字符串,然后将该字符串和指向字符串的引用添加到散列表中,如果找到就不执行任何操作。在运行时,如果需要一个字符串的引用,便在散列表中进行查找,然后将对象的引用返回。这一字符串驻留机制对于字符串比较操作相当高效。

 

StringBuilder特性:

 

1、StringBuilder主要用来创建动态改变的字符串。

 

2、StringBuilder采用动态增长的机制,如果字符串的增长超出了原来分配的字符数组,StringBuilder会自动分配一个新的,更大的数组。并将原来字符数组中的字符拷贝到新的数组中。

 

3、StringBuilder的ToString方法返回的String必须是恒定不变的,如果我们调用的StringBuilder上的方法试图改变StringBuilder中维护的字符串字段时,StringBuilder可以判断出它的ToString方法先前是否被调用过,如果是,它会在内部创建并使用一个新的字符数组,这使得我们执行的操作不会影响先前调用ToString返回的字符串。

 

综上,只有在两种情况下,一个StringBuilder对象才会分配新的对象。

 

1)动态构造一个长度超过预设容量的字符串。

 

2)在调用StringBuilder的ToString方法后,试图改变字符数组。

你可能感兴趣的:(C#,string,编译器,c#)