我在silverlight应用程序中有一个比较2个字符串的条件,由于某种原因,当我使用==时,它返回false而. equals()返回true。
代码如下:
if (((ListBoxItem)lstBaseMenu.SelectedItem).Content.Equals("Energy Attack"))
{
// Execute code
}
if (((ListBoxItem)lstBaseMenu.SelectedItem).Content == "Energy Attack")
{
// Execute code
}
你知道为什么会这样吗?
==和. equals都依赖于实际类型中定义的行为和调用位置上的实际类型。两者都只是方法/操作符,可以在任何类型上重写,并给定作者希望的任何行为。根据我的经验,我发现人们在对象上实现. equals却忽略了operator ==是很常见的。这意味着. equals将实际测量值是否相等,而==将测量它们是否是相同的引用。
当我处理一个定义不断变化的新类型或编写泛型算法时,我发现最佳实践如下
如果我想在c#中比较引用,我使用Object。直接使用ReferenceEquals(在泛型情况下不需要)
如果我想比较值,我使用EqualityComparer<T>。默认的
在某些情况下,当我觉得==的用法不明确时,我会显式地使用Object。在代码中引用等号以消除歧义。
Eric Lippert最近写了一篇博文,主题是为什么在CLR中有两种相等的方法。值得一读
http://blogs.msdn.com/ericlippert/archive/2009/04/09/double-your-dispatch-double-your-fun.aspx
==
==运算符可用于比较任何类型的两个变量,它只是比较比特。
int a = 3;
byte b = 3;
if (a == b) { // true }
注意:在int的左边有更多的0,但我们在这里不关心它。
Int a(00000011) ==字节b (00000011)
记住==运算符只关心变量中比特的模式。
如果两个引用(原语)指向堆上的同一个对象,则使用==。
无论变量是引用还是原语,规则都是相同的。
Foo a = new Foo();
Foo b = new Foo();
Foo c = a;
if (a == b) { // false }
if (a == c) { // true }
if (b == c) { // false }
A == c是正确的
A == b是假的
a和c的位模式是相同的,所以使用==它们是相等的。
等于():
使用equals()方法查看两个不同的对象是否相等。
例如两个不同的String对象都表示“Jane”中的字符