我在silverlight应用程序中有一个比较2个字符串的条件,由于某种原因,当我使用==时,它返回false而. equals()返回true。
代码如下:
if (((ListBoxItem)lstBaseMenu.SelectedItem).Content.Equals("Energy Attack"))
{
// Execute code
}
if (((ListBoxItem)lstBaseMenu.SelectedItem).Content == "Energy Attack")
{
// Execute code
}
你知道为什么会这样吗?
I am a bit confused here. If the runtime type of Content is of type string, then both == and Equals should return true. However, since this does not appear to be the case, then runtime type of Content is not string and calling Equals on it is doing a referential equality and this explains why Equals("Energy Attack") fails. However, in the second case, the decision as to which overloaded == static operator should be called is made at compile time and this decision appears to be ==(string,string). this suggests to me that Content provides an implicit conversion to string.
==
==运算符可用于比较任何类型的两个变量,它只是比较比特。
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”中的字符
注意,在c#中有两种不同类型的等式
1-值相等(对于int, DateTime和struct等值类型)
2-引用平等(对象)
有两个基本的标准协议来实现相等性检查。
1- ==和!=运算符。
2- virtual Equals方法。
==和!=是静态解析的,这意味着c#将在编译时决定哪种类型将执行比较。
例如值类型
int x = 50;
int y = 50;
Console.WriteLine (x == y); // True
但是对于参考类型
object x = 50;
object y = 50;
Console.WriteLine (x == y); // False
Equals()最初在运行时根据操作数的实际类型解析。
例如,在下面的例子中,在运行时,将决定Equals()将应用于int值,结果为真。
object x = 5;
object y = 5;
Console.WriteLine (x.Equals (y)); // True
但是,对于引用类型,它将使用引用相等性检查。
MyObject x = new MyObject();
MyObject y = x;
Console.WriteLine (x.Equals (y)); // True
注意Equals()对struct使用结构比较,这意味着它对struct的每个字段调用Equals。
这是由于值相等(equal方法)和引用相等(==运算符),因为equal方法检查值,而相同的==检查引用。
==运算符覆盖https://referencesource.microsoft.com/上string类内可用的代码
现在更容易理解了,equal方法也有两个实现一个来自string类本身,一个来自object类。它对性能的影响以及我也运行一些基本的代码,并试图理解基准测试。
我分享下面的结果,如果我错了,请纠正或建议。有3种情况,我对所有情况运行了相同的代码,这就是结果。
情况1:这里我使用的是字符串。相等的方法比较两个字符串和两个字符串有相同的值。string.equals (a, b)
第一次运行:5608195 tick
第二次运行:5529387个刻度
第三次运行:5622569滴答
总蜱数:16760151
情况2:这里我使用的是字符串。Equal()方法(重载的一个)用于比较两个字符串,并且两个字符串具有相同的值。
a.equals (b)
第一次运行:6738583滴答
第二轮:6452927
第三轮:7168897个刻度
总蜱虫= 20360407
情况3:这里我使用==操作符比较2个字符串,两个字符串都有相同的值。
a = =
第一次运行:6652151滴答
第二次运行:7514300个tick
第三轮:7634606滴答
总蜱虫= 21801057
class Program
{
private static int count;
static string a = "abcdef";
static string b = "abcdef";
static void Main(string[] args)
{
for (int j = 1; j <= 3; j++)
{
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 1; i <= 1000; i++)
{
checkString();
}
sw.Stop();
Console.WriteLine(sw.ElapsedTicks);
}
Console.ReadLine();
}
public static void checkString()
{
for (int i = 1; i <= 100000; i++)
{
if (a==b)
count++;
}
}
}