C# Object.ReferenceEquals为匹配字符串返回true
我正在使用Mono,在比较两个字符串的引用时遇到了一个有趣的结果。下面的代码演示了一个示例:C# Object.ReferenceEquals为匹配字符串返回true,c#,string,mono,C#,String,Mono,我正在使用Mono,在比较两个字符串的引用时遇到了一个有趣的结果。下面的代码演示了一个示例: using System; class Program { static void Main() { String s1 = "asd"; String s2 = "asd"; Console.WriteLine("Reference Equals: {0}", Object.ReferenceEquals(s1, s2));
using System;
class Program
{
static void Main()
{
String s1 = "asd";
String s2 = "asd";
Console.WriteLine("Reference Equals: {0}", Object.ReferenceEquals(s1, s2));
Console.ReadLine();
}
}
产生真实的
有趣的是,两个字符串具有相同的值,但显然它们引用了两个不同的实例。发生了什么事
mono--版本:mono JIT编译器版本3.2.6
OS X 10.9.2公共语言运行库通过维护 表,称为实习生池,其中包含对 在中以编程方式声明或创建的每个唯一文字字符串 你的节目。因此,使用 特定值在系统中只存在一次 下面显示了未从创建字符串时的行为
公共语言运行库通过维护 表,称为实习生池,其中包含对 在中以编程方式声明或创建的每个唯一文字字符串 你的节目。因此,使用 特定值在系统中只存在一次 下面显示了未从创建字符串时的行为 有趣的是,两个字符串具有相同的值,但显然它们是相同的 参考两个不同的实例 不,它们指的不是两个不同的实例,实际上没有两个不同的实例,只有一个实例是在提供相同的字符串文本时创建的 在您的程序中,对于所有类似的
字符串常量
只创建一个实例
,并且所有字符串引用变量
引用相同的实例
,因此当您对这些引用
中的一个运行ReferenceEquals()
方法时,您将得到True
a它们在逻辑上引用相同的实例
发件人:
CLR维护一个名为intern pool的表,该表包含
对程序运行时以编程方式声明或创建的每个文本字符串的单个唯一引用
如果希望看到预期结果,请尝试下面的代码段。当它们被传递给构造函数时,它将创建两个不同的实例
试试这个:
String s1 = new String("asd".ToCharArray());
String s2 = new String("asd".ToCharArray());
Console.WriteLine("Reference Equals: {0}",Object.ReferenceEquals(s1, s2));//False
有趣的是,两个字符串具有相同的值,但显然它们是相同的
参考两个不同的实例
不,它们指的不是两个不同的实例,实际上没有两个不同的实例,只有一个实例是在提供相同的字符串文本时创建的
在您的程序中,对于所有类似的字符串常量
只创建一个实例
,并且所有字符串引用变量
引用相同的实例
,因此当您对这些引用
中的一个运行ReferenceEquals()
方法时,您将得到True
a它们在逻辑上引用相同的实例
发件人:
CLR维护一个名为intern pool的表,该表包含
对程序运行时以编程方式声明或创建的每个文本字符串的单个唯一引用
如果希望看到预期结果,请尝试下面的代码段。当它们被传递给构造函数时,它将创建两个不同的实例
试试这个:
String s1 = new String("asd".ToCharArray());
String s2 = new String("asd".ToCharArray());
Console.WriteLine("Reference Equals: {0}",Object.ReferenceEquals(s1, s2));//False
很可能他们是国际互联网的。看起来这正是我编辑过你的问题标题。这种行为是经过设计的,如前所述,人们可能会认为这是Mono中的一个bug,而事实显然并非如此。@linquize Mono没有“bug”。这种行为是有意为之。可能是重复的,可能是网络上的。看起来这正是我编辑了你的问题标题。这种行为是经过设计的,如前所述,人们可能会认为这是Mono中的一个bug,而事实显然并非如此。@linquize Mono没有“bug”。此行为是经过设计的。可能重复