Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
子字符串是否会创建另一个实例C#?_C#_String_Substring_Equals - Fatal编程技术网

子字符串是否会创建另一个实例C#?

子字符串是否会创建另一个实例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

我不熟悉C#string,但我对

 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代码