繁体   English   中英

String.Intern 方法是否只是向实习生池添加对字符串的引用,还是创建字符串的副本?

[英]Does String.Intern method just add a reference to a string to the intern pool or it creates a copy of the string?

假设我有一个字符串'str'。 我想使用 String.Intern 方法对其进行实习。 我只是想知道,如果'str' 的值尚未被实习,String.Intern 究竟是如何工作的。 文档中对该方法的描述如下:

Intern 方法使用实习池来搜索等于 str 值的字符串。 如果存在这样的字符串,则返回其在实习池中的引用。 如果字符串不存在,则将对 str 的引用添加到实习池,然后返回该引用。

但是这本书摘自“CLR via C#”这本书的摘录不同:

Intern 获取一个字符串,为其获取 hash 代码,并检查内部 hash 表是否匹配。 如果已存在相同的字符串,则返回对已存在的字符串 object 的引用。 如果不存在相同的字符串,则制作该字符串的副本,将该副本添加到内部 hash 表中,并返回对该副本的引用。

我猜文档中的描述是正确的。 那么,实习池中只添加了一个对str的引用,而不复制字符串object?

这很容易直接测试:

// Make string from char[] to ensure it's not already interned
string s1 = new string(new[] { 'H', 'e', 'l', 'l', 'o' });
string i1 = string.Intern(s1);
bool result1 = object.ReferenceEquals(s1, i1);

string s2 = new string(new[] { 'H', 'e', 'l', 'l', 'o' });
string i2 = string.Intern(s2);
bool result2 = object.ReferenceEquals(s2, i2);

请注意, result1设置为true ,表明未复制原始string object。 另一方面, result2设置为false ,表明在实习池中找到了第二个构造的string object "Hello" ,因此string.Intern()方法返回该实习实例而不是传入的新构造实例。

string.Intern()方法不复制字符串。 它只是检查传递的引用是否等于池中已经存在的字符串,如果不是,则将其添加到池中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM