参考这个question为什么下面的代码总是返回true? [c#语言]
String a= "hello";
String b= "hello";
if(a==b)
Console.WriteLine("Is it really reference type?");
只是想要解释为什么在这里它们表现为值类型而不是引用类型。是否有关于此OR的MSDN文档或者我应该记住这个异常或者这是完全合乎逻辑的但是我没有得到它?
详细解释表示赞赏。
答案 0 :(得分:12)
任何类都可以覆盖==
运算符以提供自定义比较。 Documentation
这就是String
类的作用 - 它只是为比较提供了不同的含义 - 它检查字符串值而不是对象引用。
如果您确实想检查实例是否指向相同的引用,请使用object.ReferenceEquals(a, b)
就字符串而言,在这种情况下它们实际上是相同的引用 - 编译器将检测到字符串值完全相同并且只将它们存储在内存中一次。以下是关于String.Intern
答案 1 :(得分:2)
在.NET中,字符串的处理方式略有不同。虽然它们是引用类型,但它们似乎充当了值类型。
这个的基本原因是字符串是不可变的和唯一的。这意味着当您定义字符串a时,值“hello”将保存在堆上。
当你定义字符串b并为其赋值“hello”时,它将知道在堆上创建指向同一字符串的指针时已经有一个带有该值的字符串。它可以安全地执行此操作,因为字符串是不可变的,因此CLR知道该字符串永远不会被修改。任何修改字符串的操作都只会导致在堆上分配一个新字符串。
答案 2 :(得分:2)
重载了==
字符串运算符以检查值的相等性而不是引用相等性,即使String
是引用类型。 Microsoft建议对具有值语义的引用类型执行此操作:
但是,如果要实现预期的引用类型 具有值语义,例如复数类型,您必须覆盖 平等运算符。
有关详细信息,请参阅Object.Equals Method (Object)。