c# – String Interning

前端之家收集整理的这篇文章主要介绍了c# – String Interning前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在下面的代码中,我正在检查对象引用的相等性.
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)不是).

原文链接:https://www.f2er.com/csharp/97218.html

猜你在找的C#相关文章