为什么字符串相等比较字符
本文关键字:比较 字符 字符串 为什么 | 更新日期: 2023-09-27 18:17:27
我对字符串和它们的比较有点困惑。我所理解的是这样做:
string one = "stackoverflow";
string two = "stackoverflow";
bool equal = one == two;
这将逐个字符进行比较,对吗?
为什么会这样?If字符串是不可变的,如果两个变量具有相同的字符,则它们总是指向同一个字符串。为什么编译器不检查引用?如果有一个地方我认为引用相等意味着值相等,我认为那将是字符串。我错过了什么?
字符串字面值确实会被自动存储,但不是所有字符串都会被存储。当你动态地构建一个字符串或者在运行时以某种方式获取它时,默认情况下它不会被intern拘禁——你需要调用String.Intern
来实现。
这意味着可以具有具有不同引用的相同字符串实例。
因此,在您的情况下,如果动态地构建字符串"stackoverflow"两次并将每个赋值给变量one
和two
,则one
和two
的引用将不同,尽管值是相同的。
[…虽然string是引用类型,但是相等操作符(== .和!=)被定义为比较字符串对象的值,而不是参考文献这使得测试字符串相等更加直观。[…]
请参阅MSDN文档
和两个变量总是指向相同的字符串,如果它们有相同的字符
你怎么会那样想?这不是真的……可以有几个不同的String
实例,它们具有相同的字符:
string s = "hello world";
string s1 = s.Substring(0, 5);
string s2 = s.Substring(0, 5);
bool sameInstance = ReferenceEquals(s1, s2); // False
说明如下:http://msdn.microsoft.com/en-us/library/362314fe.aspx
基本上,这是因为即使两个相等的字符串可能由于实习而成为相同的实例,不同的实例并不总是意味着它们在内容上不同。
只有字符串字面值被显式地存储。例如,如果您这样做:
string x=Console.ReadLine();
string y=Console.ReadLine();
并为两者输入"hello",那么它们不要求x
和y
引用相同的字符串。因此,当它们进行比较时,底层实现将需要逐个字符进行比较。
可以通过调用string.Intern
在运行时执行自己的实习。
字符串是不可变的,这并不意味着不能有两个独立的字符串实例具有相同的字符-这也应该被认为是相等的。这是在运行时组装的所有字符串(非字面量)的情况,默认情况下这些字符串不被internned。