a)
string s = "value";
string s1 = "value";
s和s1引用变量指向同一个字符串对象吗?(我假设这是因为字符串是不可变的)
b) 我知道等号运算符(==,>等)已被重新定义为比较字符串对象的值,但使用静态方法Object.Equals()和Object.ReferenceEquals()比较两个字符串是否也是如此?
谢谢
a)
string s = "value";
string s1 = "value";
s和s1引用变量指向同一个字符串对象吗?(我假设这是因为字符串是不可变的)
b) 我知道等号运算符(==,>等)已被重新定义为比较字符串对象的值,但使用静态方法Object.Equals()和Object.ReferenceEquals()比较两个字符串是否也是如此?
谢谢
不,不是所有具有相同值的字符串都是相同的对象引用。
编译器生成的字符串将全部被汇总,并且是相同的引用。运行时生成的字符串默认情况下不会被汇总并且将是不同的引用。
var s1 = "abc";
var s2 = "abc";
var s3 = String.Join("", new[] {"a", "b", "c"});
var s4 = string.Intern(s3);
Console.WriteLine(ReferenceEquals(s1, s2)); // Returns True
Console.WriteLine(ReferenceEquals(s1, s3)); // Returns False
Console.WriteLine(s1 == s3); // Returns True
Console.WriteLine(ReferenceEquals(s1, s4)); // Returns True
请注意上面的一行代码,您可以使用String.Intern(string)
强制将字符串内部化,从而允许您对某些检查使用对象相等性而不是字符串相等性,这样会更快。一个常见的使用场景是在生成的 XML 序列化器代码和名称表中。
因此,具有特定值的文字字符串实例在系统中仅存在一次。
例如,如果将相同的文字字符串分配给多个变量,则运行时从intern池中检索对文字字符串的相同引用,并将其分配给每个变量