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

问题描述

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

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

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

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

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

标签: c#.netstring-interning

解决方案


这很容易直接测试:

// 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对象没有被复制。另一方面,result2设置为false,表示在实习池中找到了第二个构造string对象"Hello",因此该string.Intern()方法返回该实习实例而不是传入的新构造实例。

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


推荐阅读