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个值。
答案 0 :(得分:4)
String类重载==
运算符,所以是的,它会比较字符串的值,就像比较像int
这样的值类型。
(另外注意,编译器也在代码中实现文字字符串,因此字符串变量a
和b
实际上将引用相同的字符串对象。如果使用{{1}它也将返回Object.ReferenceEquals(a,b)
。)
答案 1 :(得分:0)
System.String
是一个重载==
运算符的类,用于比较字符串的内容。这允许它在比较中“值得”,但在其他方面仍然是参考类型。
答案 2 :(得分:0)
虽然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