Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
重写C#条件语句问题_C#_.net - Fatal编程技术网

重写C#条件语句问题

重写C#条件语句问题,c#,.net,C#,.net,我今天正在写一些代码,但有些东西并没有像我预期的那样工作 为什么即使条件的计算结果应为false,仍会执行以下代码 我试着在这两个条件周围加上括号,并切换它们的位置,但EndedUsingApplication甚至仍然执行 编辑: 它与| |或&&运算符无关。看看这个 除非我发布罪犯代码,否则没有人能从我的错误中吸取教训,所以就在这里 public static bool operator ==(ActiveApplication a, ActiveApplication b)

我今天正在写一些代码,但有些东西并没有像我预期的那样工作

为什么即使条件的计算结果应为false,仍会执行以下代码

我试着在这两个条件周围加上括号,并切换它们的位置,但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;
     }

问题似乎是当运算符收到两个空值。

不确定原因。但是,您确定正在运行的应用程序是使用您正在逐步执行的代码编译的吗。当代码与实际执行的代码不同时,我见过这种情况。

您的程序是多线程的吗


我见过这样的情况:我检查一个值,然后尝试使用它,结果发现它被更改了。所发生的是,另一个线程在我检查它之后但在我使用它之前更改了值

你确定你是在你所强调的那条线上吗?您可以在调用堆栈窗口中四处单击,并使调用堆栈的任何部分成为“当前”行,从某种意义上说,您可以在那里获得变量的值,等等

关键是,可能EndedUsingApplication将ActiveApplication设置为null,这样ActiveApplication在计算if时不是null,但现在在调试器中计算时是null


在执行该行之前,是否在EndedSingApplication(ActiveApplication)行上放置断点以确保ActiveApplication为空?

是否重载了
=


我认为更好的方法是使用
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);
     }

@杰·里格斯:宾果!是的,原来我有。这里有一些错误的逻辑,返回了错误的结果。写一个正确的答案,也许我会把它标记为答案;)@Nippy-添加作为答案!谢谢!:)-这就像玩20个问题。我假设你也有一些回归单元测试:p“a==b?false:true”表示为“!(a==b)”请看原始问题的解释。是的,教训是,如果有人试图让操作员超负荷,你就用一条鱼打他们。我们从IRC陆地上运一些漂亮的老鳟鱼来好吗?