加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – String Interning

发布时间:2020-12-15 18:00:13 所属栏目:百科 来源:网络整理
导读:在下面的代码中,我正在检查对象引用的相等性. string x = "Some Text";string y = "Some Other Text";string z = "Some Text";Console.WriteLine(object.ReferenceEquals(x,y)); // FalseConsole.WriteLine(object.ReferenceEquals(x,z)); // TrueConsole.Wr
在下面的代码中,我正在检查对象引用的相等性.
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)不是).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读