.NET编译器如何比较两个字符串?

时间:2010-04-12 09:55:12

标签: c# string-comparison

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)一样工作? string是class所以a = b意味着我们正在比较2个对象,但我想比较2个值。

6 个答案:

答案 0 :(得分:4)

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

(另外注意,编译器也在代码中实现文字字符串,因此字符串变量ab实际上将引用相同的字符串对象。如果使用{{1}它也将返回Object.ReferenceEquals(a,b)。)

答案 1 :(得分:0)

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

答案 2 :(得分:0)

  

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

C# string

答案 3 :(得分:0)

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

答案 4 :(得分:0)

这里要记住不同的事情。

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

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

没有进行运行时检查以按值比较字符串,并且编译器不会为.Equals()运算符发出==调用。

答案 5 :(得分:0)

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

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