2011-04-14 40 views
2

可能重复:
Please tell why two references are same for string object in case of string(Code written below)缺省情况下,==运算符是如何工作的?

当我写在C#s1 == s2其中两个声明为String的编译器会比较引用或内容?即如果==被替换为string类?

我只是想知道为什么这个代码打印“真”:

string s1 = "hello" 
string s2 = s1 + " "; 
s2 = s2.Trim(); // i expect new object here 
Console.WriteLine(s2 == s1); 

而且我有一些第三方来源,其中==通常用于字符串比较。这让我发疯,因为我几乎从不使用==比较Java中的字符串,现在我无法理解这段代码是如何工作的。

使用==比较C#中的字符串是否正常?

upd:感谢所有人,几乎所有的答案都是正确的。 总之:

  • 是的,它使用“==”在C#中比较字符串
  • 字符串是正常的将内容进行比较(不参考)
  • 字符串==操作符不虚。
  • 字符串在C#中是不可变的(这类似于Java)

此行为是对Java不同,其中“==”为String类比较引用。

Why strings does not compare references?

看到我个人认为语言不应该允许覆盖或过载==操作符,因为它使得像C++ :)

+0

由于.NET处理字符串实习的方式,通过内存位置比较字符串往往会产生意外的结果。我可以想象这是与Java的主要区别(Java是否会串入实际内存?) – MattDavey 2011-04-14 10:10:24

回答

7

运算符不能被覆盖多态,但它们可以是重载这是字符串的情况。重载检查内容是否平等(以序号方式,没有文化敏感性)。因此,举例来说:

string s1 = "hello"; 
string s2 = (s1 + " ").Trim(); 

object o1 = s1; 
object o2 = s2; 

Console.WriteLine(s1 == s2); // True - calls overloaded ==(string, string) 
Console.WriteLine(o1 == o2); // False - compares by reference 

注意这是怎么一模一样对象运行,但由于超负荷分辨率为编译时进行,在第二种情况下,编译器不知道叫字符串特定的运算符。

3

是,默认情况下,当你使用它作为困难==它参考equiality检查,但它重写为字符串,以便它检查的内容(因为字符串是不可变的为好)

This is great article that I like(兼作家乔恩是在这里也:))

0

即使ŧ hough System.String类是一个引用类型('string'是别名)==类型的操作方法被重写,以提供字符串类型内容之间的比较。

它们在你的例子中是相等的,因为字符串类型的内容是相同的。

0

s2 == s1会给你一个布尔结果,是的。至于.NET编程,我总是发现使用String.Compare更好。

0

是的,将C#中的字符串与==进行比较是正常的(但不一定是好的做法)。 String.Compare是一种比较可靠的比较方式,它也可以处理不同的字符集和区分大小写。

相关问题