子字符串是否会创建另一个实例C#?
我不熟悉C#string,但我对子字符串是否会创建另一个实例C#?,c#,string,substring,equals,C#,String,Substring,Equals,我不熟悉C#string,但我对 Object.referenceEquals 我在读一篇文章,上面说,ReferenceEquals检查它是否在程序中是同一个实例,我正在检查对象。ReferenceEquals(s1,s4),即使它们指向相同的数据,为什么它是假的 string s1 = "akhil"; string s2 = "akhil"; Console.WriteLine(object.ReferenceEquals(s1, s2)); //true s2 = "akhil
Object.referenceEquals
我在读一篇文章,上面说,ReferenceEquals
检查它是否在程序中是同一个实例,我正在检查对象。ReferenceEquals(s1,s4)
,即使它们指向相同的数据,为什么它是假的
string s1 = "akhil";
string s2 = "akhil";
Console.WriteLine(object.ReferenceEquals(s1, s2)); //true
s2 = "akhil jain";
Console.WriteLine(object.ReferenceEquals(s1, s2)); //false
//Console.WriteLine(s1 == s2);
//Console.WriteLine(s1.Equals(s2));
string s3 = "akhil";
//1".Substring(0, 5);
Console.WriteLine(s3+" " +s1);
Console.WriteLine(object.ReferenceEquals(s1,s3)); //true
string s4 = "akhil1".Substring(0, 5);
Console.WriteLine(object.ReferenceEquals(s1, s4)); //confusion false why as s4 data is same as s1
引用是相同的,因为一个字符串文本被插入,
Substring
返回一个新字符串和一个新引用,它不会试图猜测您的参数并检查插入池
公共语言运行库通过维护
表,称为实习生池,其中包含对
在中以编程方式声明或创建的每个唯一文字字符串
你的节目。因此,使用
特定值在系统中只存在一次
例如,如果将相同的文本字符串分配给多个变量,则运行时将检索对该文本的相同引用
字符串,并将其分配给每个变量
然而,从.NET2开始,由于各种原因,您已经能够关闭它
NoStringInterning将程序集标记为不需要字符串文字interning。在应用程序域中,公共
语言运行库为每个唯一字符串创建一个字符串对象
文字,而不是制作多个副本。这种行为称为
字符串实习,内部需要构建辅助表
消耗内存资源
实例化两个对象时,引用不相等。因此,
Object.ReferenceEquals
方法返回false。然而,字符串是一种非常特殊的情况。如果在代码中声明字符串,CLR将在表中维护该字符串。这就是所谓的。这会导致使用相同值实例化的两个字符串引用内存中的相同对象。这将导致Object.ReferenceEquals
返回true
当代码中的某个操作形成字符串时,它不会自动插入池中。因此,它具有不同的引用,尽管字符串的内容可能相同。Object.ReferenceEquals
文档的备注中也解释了这一点
请注意,String.Equals()
方法将返回true。在C#中,还可以对字符串使用“==”运算符。请参阅下面的调整代码
string s1 = "akhil";
string s2 = "akhil";
Console.WriteLine(s1.Equals(s2)); //true
s2 = "akhil jain";
Console.WriteLine(s1.Equals(s2)); //false
string s3 = "akhil";
Console.WriteLine(s3 + " " + s1);
Console.WriteLine(s1.Equals(s3)); //true
string s4 = "akhil1".Substring(0, 5);
Console.WriteLine(s1.Equals(s4)); //this now returns true as well
Console.WriteLine(s1 == s4); //so does this
object.ReferenceEquals的值为false,因为它检查两个引用是否指向同一个对象。ReferenceEquals不检查数据是否相等,但如果两个对象占用相同的内存地址 正如前面提到的,字符串文本被存储在一个名为intern pool的表中。这是为了高效地存储字符串对象 当一个字符串文本被分配给多个变量时,它们指向实习生池中的同一地址。因此,object.ReferenceEquals为true。但当您将其与子字符串进行比较时,就会在内存中创建一个新对象。当比较引用时,这会导致错误,因为它们是占用不同内存位置的两个不同对象 所有动态创建的字符串或从外部源读取的字符串都不会自动插入 如果尝试以下操作,则object.ReferenceEquals将为true:
Console.WriteLine(object.ReferenceEquals(s1, string.Intern(s4)));
您可以使用基本数据类型检查ReferenceEquals是否返回false,即使将一个变量分配给另一个变量
int a = 10;
int b = a;
Console.WriteLine(ReferenceEquals(a, b)); //false
这是因为每个基元类型都是单独存储的。它返回akhil@loocid如果有两个字符串对象,它们都具有相同的数据,但它们仍然是单独的对象-这就是为什么
ReferenceEquals
返回false<代码>子字符串不会在内存中查找所有具有相同内容的其他字符串对象。by ur语句第一个对象可能重复。ReferenceEquals(s1,s2)应该为false,那么为什么为true?因为s1和s2引用相同的对象,这是由于字符串文字的工作方式。每次在一个程序中使用C#中相同的字符串文字时,最终都会引用同一个对象。调用Substring时并非如此。除了Substring之外,还有其他方法可以创建新实例吗?@Deepak Jain每个方法,除非使用文字、intern方法或intern-IL代码