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

时间:2009-11-09 12:14:14

标签: c# .net

想知道为什么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

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

5 个答案:

答案 0 :(得分:18)

两个不同的原因;

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

StringBuilder版本失败,原因是:

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

在每个上调用ToString(),它会变得更有趣:

  • 两个字符串不是相同的参考
  • 但运营商支持保证true

答案 1 :(得分:8)

==运算符在String类中重载,其方式是使字符串值进行比较而不是对象引用,这是默认值。

答案 2 :(得分:3)

因为==运算符被重新定义为字符串。

请参阅MSDN

答案 3 :(得分:0)

这是因为已经重写了相等运算符以提供您看到的功能。您可以通过覆盖equals运算符在任何类型上执行此操作。

答案 4 :(得分:-2)

使用==表示字符串是不好的做法,只需使用Equals()。

Details