使用==时,为什么String的行为类似于值类型

Won*_*ing 6 .net c#

想知道为什么String在使用==时表现得像值类型.

         String s1 = "Hello";
        String s2 = "Hello";
        Console.WriteLine(s1 == s2);// True(why? s1 and s2 are different)
        Console.WriteLine(s1.Equals(s2));//True
        StringBuilder a1 = new StringBuilder("Hi");
        StringBuilder a2 = new StringBuilder("Hi");
        Console.WriteLine(a1 == a2);//false
        Console.WriteLine(a1.Equals(a2));//true
Run Code Online (Sandbox Code Playgroud)

StringBuilder和String的行为与==运算符不同.谢谢.

Mar*_*ell 18

两个不同的原因;

  • 实习 - 由于"Hello"字符串被编译到源中,它们相同的引用 - 检查ReferenceEquals(s1,s2)- 它将返回true
  • 自定义相等 - 字符串具有相等运算符(特别是==/ !=(又名op_Equality/ op_Inequality)

StringBuilder版本失败,因为:

  • 它们不是相同的引用(这些是在托管堆上单独创建的常规托管对象)
  • StringBuilder 没有运营商

呼叫ToString()每个,它变得更有趣:

  • 这两个字符串的引用一样
  • 但是运营商的支持保证了 true


Kon*_*man 8

==操作符被重载在String类,在某种程度上,使字符串值进行比较,而不是对象的引用,这是缺省值.