为什么字符串相等性比较字符?

时间:2011-12-08 14:08:27

标签: c#

我对字符串及其比较感到困惑。 我理解的是这样做:

string one = "stackoverflow";
string two = "stackoverflow";

bool equal = one == two;

这会逐字符比较吗?

为什么会这样?如果string是不可变的,并且如果它们具有相同的字符,则两个变量将始终引用相同的字符串。为什么编译器不检查引用? 如果有一个地方,我认为引用平等意味着价值平等,我认为这将是字符串。我错过了什么?

6 个答案:

答案 0 :(得分:7)

确实,字符串文字会自动实现,但所有字符串都不会被实习。当您动态构建字符串或在运行时以某种方式获取它时,默认情况下它不会被实例化 - 您需要调用String.Intern才能实现。

这意味着可以具有不同引用的相同字符串实例。

因此,在您的情况下,如果动态构建字符串“stackoverflow”两次并将每个字符串分配给变量onetwo,则引用{{1 }和one会有所不同,但是相同的。

答案 1 :(得分:3)

  

[...]尽管string是引用类型,但是相等运算符(==   和!=)被定义为比较字符串对象的值,而不是   引用。这使得对字符串相等性的测试更加直观。   [...]

See MSDN documentation

答案 2 :(得分:1)

  

如果两个变量具有相同的字符

,它们将始终引用相同的字符串

是什么让你这么想?事实并非如此......您可以拥有几个具有相同字符的String个不同实例:

string s = "hello world";
string s1 = s.Substring(0, 5);
string s2 = s.Substring(0, 5);

bool sameInstance = ReferenceEquals(s1, s2); // False

答案 3 :(得分:1)

这在此解释:http://msdn.microsoft.com/en-us/library/362314fe.aspx

基本上,它是因为即使两个相等的字符串由于实习而可能是同一个实例,但是不同的实例并不总是意味着它们的内容不同。

答案 4 :(得分:1)

只显示字符串文字。例如,如果您这样做:

string x=Console.ReadLine();
string y=Console.ReadLine();

然后输入“hello”,然后他们就不要求xy引用相同的字符串。因此,当他们进行比较时,底层实现将需要进行逐字符比较。

通过调用string.Intern可以在运行时进行自己的实习。

答案 5 :(得分:0)

字符串是不可变的,这并不意味着不能有两个具有相同字符的单独字符串实例 - 可以说这些字符串实例也应该被认为是相同的。对于在运行时汇编的所有字符串(非文字),默认情况下不会中断这种情况。