覆盖 C# 条件语句问题

17
今天我在写代码,发现有些东西没有按照我的预期工作。
为什么下面的代码会执行,即使条件本应该被评估为false? alt text http://img215.imageshack.us/img215/3011/agfewrf.gif 我已经尝试过在两个条件周围加上大括号,并交换它们的位置,但EndedUsingApplication仍然被执行。
编辑:
这与||或&&运算符无关。看这里...

alt text

除非我发布罪犯代码,否则没有人能从我的错误中学习,所以这里是代码。

  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;
     }

问题似乎出现在"!="运算符接收到两个null值时。


@Nippy - 请添加为答案!谢谢! - Jay Riggs
2
这就像是在玩20个问题游戏。 - trampster
我假设你也在其中加入了一些回归单元测试 :p - Brendan Kowitz
更加清晰地表达,也就是说 - Andrey Fedorov
你是指 == 还是 object.ReferenceEquals() - John Alexiou
显示剩余3条评论
5个回答

52
你是否过度使用了!=

请参见原问题以获取说明。 - Nippysaurus
5
是的,这个教训就是如果有人试图过载运算符,你就用鱼打他们。 - Noon Silk
我们从IRC之地运来一些美味的陈年鳟鱼如何? - jrista

3

不确定为什么。但是您确定正在运行的应用程序是使用您正在步进的代码编译的吗?当代码与实际执行的内容不同时,我曾经看到过这种情况。


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);
     }

1
你的程序是多线程的吗?
我曾经遇到过这样的情况,我检查了一个值,然后尝试使用它,结果发现它已经被改变了。原因是在我检查完之后,在我使用它之前,另一个线程已经改变了这个值。

1

你确定你实际上在你所突出显示的那一行吗?你可以在调用堆栈窗口中点击并将调用堆栈的任何部分设置为“当前”行,这样你就可以获取那里的变量值等。

重点是,也许EndedUsingApplication将ActiveApplication设置为null,所以当它在if语句中被评估时,ActiveApplication不是null,但是在调试器中评估它时,现在它是null。

你是否在EndedUsingApplication(ActiveApplication)这一行上设置了断点,以确保在执行该行之前ActiveApplication是null?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接