一个)
string s = "value";
string s1 = "value";
Run Code Online (Sandbox Code Playgroud)
s和s1引用变量是否指向相同的字符串对象(我假设这是因为字符串是不可变的)?
b)我意识到已经重新定义了相等运算符(==,> etc)来比较字符串对象的值,但是在使用静态方法Object.Equals()和Object.ReferenceEquals()比较两个字符串时是否相同?
感谢名单
Sam*_*eff 21
不,并非所有具有相同值的字符串都是相同的对象引用.
编译器生成的字符串都将被Interned并且是相同的引用.在运行时生成的字符串默认情况下不会被实现,并且将是不同的引用.
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
Run Code Online (Sandbox Code Playgroud)
请注意上面的行,您可以使用String.Intern(string)该行强制使用字符串,然后允许您使用对象相等而不是字符串相等进行某些检查,这要快得多.这是非常常用的一个示例是在生成的XML序列化程序代码中以及名称表.