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

sam*_*m95 2 c# string string-literals assignment-operator

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

string s1 = "OldValue";
Run Code Online (Sandbox Code Playgroud)

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

我试图理解字符串类的设计是什么,保证s1的价值仍为"OldValue":

string s2 = s1;
s2 = "NewValue";
Run Code Online (Sandbox Code Playgroud)

que*_*atl 6

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

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

当你写:

string s1 = "mom";
string s2 = s1;
string s3 = s1;
s3 = "dad";
Run Code Online (Sandbox Code Playgroud)

只有一个"妈妈"的实例,它首先在堆中的某个地方创建,然后对它的引用被分配给s1.然后创建另一个引用并将其分配给s2.然后创建另一个引用并将其分配给s3.没有副本.引用.就像任何真实的普通CLR对象一样.

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

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