在下面的代码中,我正在检查对象引用的相等性.
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
这里:
> x和z是指相同的对象;我可以说x是interned,z是用taht版本.嗯,我不知道这个;请纠正我,如果我错了.
>我通过赋予它与x相同的值来改变y的值.我以为会在这里创造一个新的对象但我错了,它使用了相同的参考.
我的问题是:
> .net使用string interns为我使用的每个字符串?
>如果是这样,不是伤害了表演吗?
>如果没有,在上面的例子中引用如何变得相同?
解决方法
是的,编译器中的常量字符串表达式被处理为ldstr,它保证实习(通过
MSDN):
The Common Language Infrastructure (CLI) guarantees that the result of two ldstr instructions referring to two Metadata tokens that have the same sequence of characters return precisely the same string object (a process known as “string interning”).
这不是每个字符串;它是您的代码中的常量字符串表达式.例如:
string s = "abc" + "def";
只有1个字符串表达式 – IL将是“abcdef”上的ldstr(编译器可以计算组合表达式).
这不会伤害表演.
int i = GetValue(); string s = "abc" + i;
在这里,“abc”被实习,但是“abc8”不是.另请注意:
char[] chars = {'a','b','c'}; string s = new string(chars); string t = "abc";
注意s和t是不同的引用(文字(分配给t))被内联,但新的字符串(分配给s)不是).