在C#中为字符串分配字符串文字

时间:2015-06-29 11:42:15

标签: c# string assignment-operator string-literals

字符串文字在C#中是否具有特定类型(如c ++中的const char *),或者C#是否只为程序中出现的每个字符串文字创建一个新的字符串对象? 我很想知道在执行以下语句时幕后发生的事情:

string s1 = "OldValue";

这会调用字符串类中的特定方法(构造函数,或者一个impicit转换运算符,......),还是C#创建一个包含" OldValue"的新字符串对象。 (然后只是将它的引用分配给s1,就像它对任何引用类型一样)?

我试图理解字符串类的设计是什么,它保证了s1遗留物的价值" OldValue":

string s2 = s1;
s2 = "NewValue";

3 个答案:

答案 0 :(得分:6)

关于你的最后一个问题,为什么保留了值 - 它不在String类中。这是对象引用的方式。

String类不是值类型,它是引用类型。它是一个功能齐全的对象,在“传入int / from变量”时不会被复制。

当你写:

string s1 = "mom";
string s2 = s1;
string s3 = s1;
s3 = "dad";

只有一个“妈妈”的实例,它首先在堆中的某处创建,然后对它的引用被分配给s1。然后创建另一个引用并将其分配给s2。然后创建另一个引用并将其分配给s3。没有副本。引用。与任何真实,正常的CLR对象一样。

最后,在最后一行中,在堆上创建另一个字符串,然后将对它的引用分配给s3变量。请注意,这句话说绝对没有关于“妈妈”或s1 / s2变量。他们没有注意到一件事。

请记住,String不是值类型。它只是一个普通的不可变对象,有一些方便的Equals和GetHashCode覆盖。 String类里面有一些小魔法,但这里没有关系。

答案 1 :(得分:0)

好问题。

实际上在c#字符串中以缓冲区数组的格式存储,其中每个字符串声明需要20bytes来存储数据并为每个字符发布2个字节。 所以每当你为例如声明任何字符串时string s1 ='Bhushan'; 然后将创建字符串缓冲区,并具有以下内存要求,

数据(开销)所需的字节数:20字节 每个字符2个字节,因此(2 * 7):14个字节 总的来说,它需要20 + 14 = 34字节。

答案 2 :(得分:0)

string是一个不可变类,这意味着每次我们更改值时,它都会创建新实例。

string s2 = s1;
s2 = "NewValue";

可以这样解释。

string s2 = s1;
s2 = new string("NewValue"); // It doesn't compile, just an example.

对于字符串修改,可以这样解释。

string s = "blah";
s.Insert(0, "blah"); // s is a new instance

同样如:

string s = "blah";
s = new string("blah") + new string("blah"); // Doesn't compile, just an explanation