为什么ReferenceEquals(s1,s2)返回true

时间:2010-11-20 12:49:58

标签: c# string

  String s1 = "Hello";
  String s2 = "Hello";

这里s1,s2不同但是为什么ReferenceEquals()返回true

5 个答案:

答案 0 :(得分:26)

这是由于实习 - CLI会自动重新使用获取的字符串作为文字(即直接来自源代码的字符串)。请注意,如果您这样做:

char[] chars = {'h','e','l','l','o'};
string s1 = new string(chars);
string s2 = new string(chars);

他们是同一个字符串实例,因为它们不是来自文字。

这是针对Ldstr IL instruction

记录的
  

公共语言基础结构(CLI)保证引用具有相同字符序列的两个元数据标记的两个ldstr指令的结果精确地返回相同的字符串对象(称为“字符串实习”的过程)。

答案 1 :(得分:2)

字符串是不可变的,一旦在内存中创建后,相同的String对象就会引用先前创建的String对象 更多 http://msdn.microsoft.com/en-us/library/362314fe.aspx

答案 2 :(得分:2)

字符串为immutable因此对相同的值使用相同的引用 另请参阅Eric lippert博客了解有关此内容的所有内容

答案 3 :(得分:1)

如果你谷歌“ReferenceEquals字符串”

你会得到this

以下是链接中已接受的答案,以防链接死亡

  

在这个例子中,“obj1”和“obj2”是单独的实例,对吗?

否 - 字符串是引用类型,而obj1和obj2是指向同一实例的两个变量,部分原因是由于实际的内容;基本上,程序集*中的任何字符串文字都可以共享相同的字符串引用。这是可能的,因为字符串是不可变的。您还可以检查实习字符串(string.IsInterned),并根据需要手动实习(string.Intern)。

  

当两个字符串具有相同的值时,它们是否共享同一个实例?

他们可能拥有相同的实例;但不保证。在运行中生成的字符串通常不会被实现;例如,这里唯一共享参考的是2& 4:

string tmp1 =“aa”,tmp2 =“aaa”;

string s1 = new string('a',5),

s2 =“aaaaa”,

s3 = tmp1 + tmp2,

s4 =“aaaaa”;

Console.WriteLine(ReferenceEquals(s1,s2));

Console.WriteLine(ReferenceEquals(s1,s3));

Console.WriteLine(ReferenceEquals(s1,s4));

Console.WriteLine(ReferenceEquals(s2,s3));

Console.WriteLine(ReferenceEquals(s2,s4));

Console.WriteLine(ReferenceEquals(s3,s4));

* =严格:net-module

答案 4 :(得分:1)

您还可以使用String.Copy(String str)静态方法创建将成为不同对象的字符串

String s1 = "Hello";
String s2 = string.Copy("Hello");

然后s1和s2将引用不同的对象。