字符串实习

Nav*_*hat 11 .net c# string

在下面的代码中,我正在检查对象引用的相等性.

string x = "Some Text";
string y = "Some Other Text";
string z = "Some Text";

Console.WriteLine(object.ReferenceEquals(x, y)); // False
Console.WriteLine(object.ReferenceEquals(x, z)); // True
Console.WriteLine(object.ReferenceEquals(y, z)); // False

y = "Some Text";

Console.WriteLine(object.ReferenceEquals(x, y)); // True
Console.WriteLine(object.ReferenceEquals(x, z)); // True
Console.WriteLine(object.ReferenceEquals(y, z)); // True
Run Code Online (Sandbox Code Playgroud)

这里:

  • xz指同一个对象; 我可以说x是实习并z使用了taht版本.好吧,我不确定这个; 如果我错了,请纠正我.
  • y通过赋予它与x相同的值来改变它的值.我以为它会在这里创建一个新对象; 但我错了,它使用相同的参考.

我的问题是:

  • 是否为我使用的每个字符串.net使用字符串实习生
  • 如果是这样,是不是会伤害表现?
  • 如果没有,上面的例子中引用如何变得相同?

Mar*_*ell 14

是的,编译器中的常量字符串表达式被处理ldstr,这保证了实习(通过MSDN):

公共语言基础结构(CLI)保证引用具有相同字符序列的两个元数据标记的两个ldstr指令的结果精确地返回相同的字符串对象(称为"字符串实习"的过程).

这不是每一个字符串; 它是代码中的常量字符串表达式.例如:

string s = "abc" + "def";
Run Code Online (Sandbox Code Playgroud)

只有1个字符串表达式 - IL将是"abcdef"上的ldstr(编译器可以计算组合表达式).

这不会影响性能.

在运行时生成的字符串不会自动实现,例如:

int i = GetValue();
string s = "abc" + i;
Run Code Online (Sandbox Code Playgroud)

这里,"abc"被实习,但"abc8"不是.另请注意:

char[] chars = {'a','b','c'};
string s = new string(chars);
string t = "abc";
Run Code Online (Sandbox Code Playgroud)

注意,st有不同的参考值(文字(分配t)被扣留,但新的字符串(分配s)不是).