我今天正在编写一些代码,而且有些东西没有像我预期的那样工作。
为什么即使条件应该评估为false,下面的代码也会执行?
alt text http://img215.imageshack.us/img215/3011/agfewrf.gif
我尝试围绕这两个条件放置大括号,并切换它们的位置,但EndedUsingApplication甚至仍然执行。
编辑:
与||无关或者&&运营商。看看这个...
除非我发布罪魁祸首代码,否则没有人可以从我的错误中吸取教训,所以在这里。
public static bool operator ==(ActiveApplication a, ActiveApplication b)
{
if ((object)a == null || (object)b == null)
return false;
return a.process_name == b.process_name && a.window_title == b.window_title;
}
public static bool operator !=(ActiveApplication a, ActiveApplication b)
{
return a == b ? false : true;
}
这是工作代码......
public static bool operator ==(ActiveApplication a, ActiveApplication b)
{
// Casting to object class prevents this comparison operator being executed
// again and causing an infinite loop (which I think .NET detects and stops
// but it would still be a huge hole in the logic.
if ((object)a == null && (object)b == null)
return true;
if ((object)a == null ^ (object)b == null)
return false;
return a.process_name == b.process_name && a.window_title == b.window_title;
}
public static bool operator !=(ActiveApplication a, ActiveApplication b)
{
return a == b ? false : true;
}
问题似乎是在!=运算符收到两个空值时。
答案 0 :(得分:52)
您是否超载!=
?
答案 1 :(得分:3)
不确定原因。但是你确定使用你正在逐步完成的代码编译正在运行的应用程序。当代码与实际执行的代码不同时,我已经看到过这种情况。
答案 2 :(得分:1)
你的程序是多线程的吗?
我已经看过我检查一个值的情况,然后尝试仅使用它来查找它的更改。发生了什么是另一个线程在检查之后但在我使用它之前更改了值。
答案 3 :(得分:1)
您确定自己确实在线上突出显示了吗?您可以在调用堆栈窗口中单击并使调用堆栈的任何部分成为“当前”行,因为您可以获取变量的值等等。
关键是,EndedUsingApplication可能将ActiveApplication设置为null,因此当评估if时,ActiveApplication 不是 null,而当你评估时,现在它是null它在调试器中。
您是否在EndedUsingApplication(ActiveApplication)行中设置了一个断点,以确保在执行该行之前ActiveApplication为null?
答案 4 :(得分:1)
我认为更好的方法是使用Object.ReferenceEquals
,因为它更明确:
public static bool operator ==(ActiveApplication a, ActiveApplication b)
{
// same reference so equals is true - will be true for null == null
if (object.ReferenceEquals(a, b))
return true;
// one is null and the other is not
if (object.ReferenceEquals(a, null) || object.ReferenceEquals(b, null))
return false;
// dealt with all combinations of null - compare fields
return a.process_name == b.process_name && a.window_title == b.window_title;
}
public static bool operator !=(ActiveApplication a, ActiveApplication b)
{
return !(a == b);
}