在C#中考虑以下代码:
String a = "hello world";
List<String> ListA = new List<String>();
List<String> ListB = new List<String>();
ListA.Add(a);
ListB.Add(a);
我的问题是:两个列表中的两个字符串实际上是指向内存中的相同位置吗?换句话说,为同一个字符串提供多个容器的附加内存只是关于引用(指针)而不是字符串的实际内存?
感谢。
答案 0 :(得分:3)
在您的代码中,a
是对字符串的引用。在两个列表中添加相同的引用将引用相同的内存位置。
答案 1 :(得分:0)
我的问题是:两个列表中的两个字符串实际上是指向内存中的相同位置吗?
是的,他们是。您添加了相同的字符串两次,现在两个列表都引用了它的事实并没有改变事实,即所述字符串的单个实例。
另一个因素是您正在创建一个字符串文字,它将被插入到字符串池中。这将使任何其他创建相同字符串的方法重新使用已分配的字符串,而不是分配新字符串。
来自string.Intern
的文档:
公共语言运行库通过维护一个名为intern pool的表来保存字符串存储,该表包含对程序中以编程方式声明或创建的每个唯一文字字符串的单个引用。因此,具有特定值的文字字符串实例仅在系统中存在一次。