1
string a="I am comparing 2 string";
string b="I am comparing 2 string";

if(a==b)
  return true;
else
  return false;

.NET 编译器如何比较两个字符串?字符串是否像 struct(int) 一样工作?字符串是类,所以 a=b 表示我们正在比较 2 个对象,但我想比较 2 个值。

4

6 回答 6

4

String 类重载了==运算符,所以是的,它比较字符串的值,就像比较值类型一样int

(附带说明,编译器还在代码中实习文字字符串,因此字符串变量a实际上b将引用相同的字符串对象。如果您使用Object.ReferenceEquals(a,b)它也将返回true。)

于 2010-04-12T10:01:28.150 回答
0

System.String是一个==重载运算符以比较字符串内容的类。这允许它在比较中是“类似值的”,但在其他方面仍然是参考类型。

于 2010-04-12T09:57:57.800 回答
0

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

C# 字符串

于 2010-04-12T09:58:07.700 回答
0

字符串由运行时进行比较,而不是编译器。比较由相等运算符执行。

于 2010-04-12T10:00:00.073 回答
0

这里有不同的事情要记住。

首先,所有相同的常量字符串都将被保留,以便两个引用都等于开始。因此,即使你在ReferenceEquals()这里做了 a,你也会得到“真实”的结果。因此,仅对于构建的字符串(例如使用 aStringBuilder或从文件中读取等),您将获得另一个引用,因此在进行引用相等比较时为 false。

如果在编译时这两个对象都是字符串,编译器将发出代码来比较它们的值(==重载运算符 on System.String),而不是它们的引用。请注意,一旦您将其与object类型引用进行比较,情况就不再如此了。

不执行运行时检查来按值比较字符串,并且编译器不会发出.Equals()对运算符的调用==

于 2010-04-12T10:04:01.623 回答
0

请注意,您的问题有点棘手。因为 ReferenceEquals 也将返回 true。

这是因为实习:http ://en.wikipedia.org/wiki/String_interning

于 2010-04-12T10:04:24.287 回答