【问题标题】:Why does == for String variables returns true?为什么 == for String 变量返回 true?
【发布时间】:2013-05-11 05:12:48
【问题描述】:

参考这个question为什么下面的代码总是返回true? [c#语言]

String a= "hello";
String b= "hello";
if(a==b)
Console.WriteLine("Is it really reference type?");

只是想解释一下为什么它们在这里表现为值类型而不是引用类型。是否有任何关于此的 MSDN 文档,或者我应该记住这个异常,或者这完全合乎逻辑但我不明白吗?

感谢详细解释。

【问题讨论】:

    标签: asp.net .net c#-4.0


    【解决方案1】:

    任何类都可以覆盖== 运算符以提供自定义比较。 Documentation.

    这就是String 类所做的——它只是为比较提供了不同的含义——它检查字符串值而不是对象引用。

    如果你真的想检查实例是否指向同一个引用,请使用object.ReferenceEquals(a, b)

    就字符串而言,在这种情况下它们实际上是相同的引用 - 编译器将检测到字符串值完全相同并将它们存储在内存中一次。这里有一些关于String.Intern的读物

    【讨论】:

    • 太棒了!最后我明白这是如何工作的。它基本上是以这种方式定义的运算符 == 仅用于比较值而不是引用。感谢分享 MSDN 路径。
    【解决方案2】:

    在 .NET 中,字符串的处理方式略有不同。尽管它们是引用类型,但它们似乎充当值类型。

    这样做的基本原因是字符串是不可变的和唯一的。这意味着当您定义字符串 a 时,值“hello”将保存在堆中。

    当您定义字符串 b 并为其分配值“hello”时,它将知道堆上已经有一个具有该值的字符串,然后创建指向同一字符串的指针。它可以安全地执行此操作,因为字符串是不可变的,因此 CLR 知道该字符串永远不会被修改。任何修改字符串的操作,只会导致在堆上分配一个新的字符串。

    【讨论】:

      【解决方案3】:

      字符串的== 运算符被重载以检查值相等而不是引用相等,即使String 是引用类型。 Microsoft 建议对具有值语义的引用类型执行此操作

      但是,如果您要实现的引用类型旨在 具有值语义,例如复数类型,必须重写 相等运算符。

      更多详情请见Object.Equals Method (Object)

      【讨论】:

        猜你喜欢
        • 2014-12-20
        • 1970-01-01
        • 2017-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-10
        • 2015-08-30
        • 2010-09-13
        相关资源
        最近更新 更多