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