字符串变量引用与对转换为 的同一变量的引用相同object。但是相同字符串的两个引用object不匹配。为什么会发生这种情况immutable?相同情况下的常量具有匹配但不匹配输入字符串的引用。
申请代码:
class Program
{
const string S1 = "123";
const string S2 = "123";
static void Main(string[] args)
{
var s1 = Console.ReadLine(); // 123
var s2 = Console.ReadLine(); // 123
Console.WriteLine(s1 == s2); // True
Console.WriteLine(s1 == (object)s1); // True
Console.WriteLine(s2 == (object)s2); // True
Console.WriteLine(s1 == (object)s2); // False
Console.WriteLine((object)s1 == (object)s2); // False
Console.WriteLine((object)S1 == (object)S2); // True
}
}
因为运算符不是虚拟的,而是在编译时根据类型定义的。如果您进行了转换,
object则将调用运算符==,它将简单地比较链接,但它们在这里和 不相等False。还可以看到编译后的代码:SharpLab
在哪里可以看到调用了哪个比较运算符。
在 C# 中,存在字符串暂留,这是一种仅存储一个字符串副本的方法,因此不会不时为相同的字符串分配内存。您可以将代码更改为以下
然后当你输入一个已经存储在池中的字符串的值时,将返回一个指向现有字符串的链接,如果池中没有这样的字符串,那么将添加这个字符串并返回一个指向它的链接.
你可以在这里和这里阅读更多。