我在Silverlight应用程序中有一个比较2个字符串的条件,由于某种原因,当我使用==它时返回false而.Equals()返回true.
这是代码:
if (((ListBoxItem)lstBaseMenu.SelectedItem).Content.Equals("Energy Attack"))
{
// Execute code
}
if (((ListBoxItem)lstBaseMenu.SelectedItem).Content == "Energy Attack")
{
// Execute code
}
Run Code Online (Sandbox Code Playgroud)
任何理由为什么会这样?
他们真的一样吗?今天,我遇到了这个问题.这是立即窗口的转储:
?s
"Category"
?tvi.Header
"Category"
?s == tvi.Header
false
?s.Equals(tvi.Header)
true
?s == tvi.Header.ToString()
true
Run Code Online (Sandbox Code Playgroud)
所以,无论是s和tvi.Header包含"类别",而是==返回false,并Equals()返回true.
s被定义为字符串,tvi.Header实际上是一个WPF TreeViewItem.Header.那么,他们为什么会回归不同的结果呢?我一直认为它们可以在C#中互换.
任何人都可以解释为什么会这样吗?
我对这三个的理解是:
.Equals()测试数据平等(缺乏更好的描述)..Equals()可以为同一对象的不同实例返回True,这是最常被覆盖的方法.
.ReferenceEquals() 测试两个对象是否是同一个实例,并且不能被覆盖.
==ReferenceEquals()默认情况下与此相同,但可以覆盖此项.
但C#站说:
在对象类中,
Equals和ReferenceEquals方法在语义上是等效的,除了ReferenceEquals它只在对象实例上有效.该ReferenceEquals方法是静态的.
现在我没理解.任何人都可以对此有所了解吗?