我对字符串及其比较感到困惑。 我理解的是这样做:
string one = "stackoverflow";
string two = "stackoverflow";
bool equal = one == two;
这会逐字符比较吗?
为什么会这样?如果string是不可变的,并且如果它们具有相同的字符,则两个变量将始终引用相同的字符串。为什么编译器不检查引用? 如果有一个地方,我认为引用平等意味着价值平等,我认为这将是字符串。我错过了什么?
答案 0 :(得分:7)
确实,字符串文字会自动实现,但所有字符串都不会被实习。当您动态构建字符串或在运行时以某种方式获取它时,默认情况下它不会被实例化 - 您需要调用String.Intern
才能实现。
这意味着可以具有不同引用的相同字符串实例。
因此,在您的情况下,如果动态构建字符串“stackoverflow”两次并将每个字符串分配给变量one
和two
,则引用{{1 }和one
会有所不同,但值是相同的。
答案 1 :(得分:3)
[...]尽管string是引用类型,但是相等运算符(== 和!=)被定义为比较字符串对象的值,而不是 引用。这使得对字符串相等性的测试更加直观。 [...]
答案 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”,然后他们就不要求x
和y
引用相同的字符串。因此,当他们进行比较时,底层实现将需要进行逐字符比较。
通过调用string.Intern
可以在运行时进行自己的实习。
答案 5 :(得分:0)
字符串是不可变的,这并不意味着不能有两个具有相同字符的单独字符串实例 - 可以说这些字符串实例也应该被认为是相同的。对于在运行时汇编的所有字符串(非文字),默认情况下不会中断这种情况。