我在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)
任何理由为什么会这样?
Meh*_*ari 410
当==在表达式上使用时object,它将解析为System.Object.ReferenceEquals.
Equals只是一种virtual方法并且行为如此,因此将使用被覆盖的版本(对于string类型比较内容).
Blu*_*kMN 293
将对象引用与字符串进行比较时(即使对象引用引用字符串),将==忽略特定于字符串类的运算符的特殊行为.
通常(当不处理字符串时),Equals比较值,同时==比较对象引用.如果您要比较的两个对象是指对象的同一个确切实例,则两者都将返回true,但如果一个具有相同的内容并来自不同的源(是具有相同数据的单独实例),则只有Equals将返回true.但是,正如注释中所指出的,string是一种特殊情况,因为它会覆盖==运算符,因此当纯粹使用字符串引用(而不是对象引用)进行处理时,即使它们是单独的实例,也只会比较这些值.以下代码说明了行为的细微差别:
string s1 = "test";
string s2 = "test";
string s3 = "test1".Substring(0, 4);
object s4 = s3;
Console.WriteLine("{0} {1} {2}", object.ReferenceEquals(s1, s2), s1 == s2, s1.Equals(s2));
Console.WriteLine("{0} {1} {2}", object.ReferenceEquals(s1, s3), s1 == s3, s1.Equals(s3));
Console.WriteLine("{0} {1} {2}", object.ReferenceEquals(s1, s4), s1 == s4, s1.Equals(s4));
Run Code Online (Sandbox Code Playgroud)
输出是:
True True True
False True True
False False True
Run Code Online (Sandbox Code Playgroud)
Jar*_*Par 45
==并且.Equals都依赖于实际类型中定义的行为和呼叫站点的实际类型.两者都只是方法/运算符,可以在任何类型上重写,并给出作者所希望的任何行为.根据我的经验,我发现人们.Equals在对象上实现但忽略了实现运算符是很常见的==.这意味着.Equals实际上==将测量值的相等性,同时测量它们是否是相同的参考.
当我使用一种新的类型,其定义是不变的或编写通用算法时,我发现最佳实践如下
Object.ReferenceEquals直接使用(在通用情况下不需要)EqualityComparer<T>.Default在某些情况下,当我觉得使用==不明确时,我会Object.Reference在代码中明确使用equals来消除歧义.
Eric Lippert最近做了一篇关于为什么CLR中有两种平等方法的博客文章.值得一读
Col*_*nic 19
首先,有是有差别.对于数字
> 2 == 2.0
True
> 2.Equals(2.0)
False
Run Code Online (Sandbox Code Playgroud)
对于字符串
> string x = null;
> x == null
True
> x.Equals(null)
NullReferenceException
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,==行为都比.Equals
kas*_*hif 13
==运算符 1.如果操作数是值类型且它们的值相等,则返回true,否则返回false.2.如果操作数是参考类型而不是字符串,并且两者都引用同一个对象,则返回true,否则返回false.3.如果操作数是字符串类型且它们的值相等,则返回true,否则返回false.
.Equals 1.如果操作数是引用类型,它执行引用相等,如果两者都引用同一个对象,则返回true,否则返回false.2.如果操作数是值类型,那么与==运算符不同,它首先检查它们的类型,如果它们的类型相同则执行==运算符,否则返回false.
因为.Equal到目前为止还没有提到该方法的静态版本,我想在这里添加这个以总结和比较 3 个变体。
MyString.Equals("Somestring")) //Method 1
MyString == "Somestring" //Method 2
String.Equals("Somestring", MyString); //Method 3 (static String.Equals method) - better
Run Code Online (Sandbox Code Playgroud)
whereMyString是来自代码中其他地方的变量。
背景信息和总结:
在 Java 中==不应使用用于比较字符串。如果您需要同时使用这两种语言,我会提到这一点,并且让您知道 using==也可以用 C# 中更好的东西代替。
在 C# 中,使用方法 1 或方法 2 比较字符串没有实际区别,只要它们都是字符串类型。但是,如果一个为空,一个是另一种类型(如整数),或者一个表示具有不同引用的对象,那么,如最初的问题所示,您可能会遇到比较内容是否相等可能不会返回什么你期待。
建议的解决方案:
因为 using==与.Equals比较事物时的using并不完全相同,所以您可以改用静态 String.Equals方法。这样,如果两侧的类型不同,您仍然会比较内容,如果一个为空,您将避免异常。
bool areEqual = String.Equals("Somestring", MyString);
Run Code Online (Sandbox Code Playgroud)
写的多一点,但在我看来,使用起来更安全。
以下是从 Microsoft 复制的一些信息:
public static bool Equals (string a, string b);
Run Code Online (Sandbox Code Playgroud)
参数
a 细绳
要比较的第一个字符串,或null.
b 细绳
要比较的第二个字符串,或null。
退货 Boolean
true如果 的值a与 的值相同b;否则,false。如果a和b都是null,则该方法返回true。
作为对已经很好的答案的补充:此行为不仅限于字符串或比较不同的数字类型。即使两个元素都是相同基础类型的 object 类型。“==”不起作用。
以下屏幕截图显示了比较两个对象 {int} - 值的结果
| 归档时间: |
|
| 查看次数: |
282095 次 |
| 最近记录: |