C#如何检查if语句的哪一部分是正确的[关闭]
Posted
技术标签:
【中文标题】C#如何检查if语句的哪一部分是正确的[关闭]【英文标题】:C# How to check which part of an if statement is correct [closed] 【发布时间】:2016-04-13 15:46:46 【问题描述】:我想知道如何检查 if 语句的哪一部分是正确的。例如,如果你有这个:
int a = 1, b, c, d;
if(a > 0 || b > 1 || c > 2 || d > 3)
//do stuff
现在在这种情况下,使 if 正确的是a
。那么如何验证这一点呢?
基本上你可以把它们放在 4 种不同的 if 中,但是如果你必须为每个 if 做一个重复的代码,你可能会想出一些方法来解决它,但实际上没有一种方法可以传递一些值吗?
【问题讨论】:
如果你在每个分支中都有重复的代码,做我们面对重复代码时通常会做的事情:将其重构为一个方法。 是的,我认为你可以做到这一点,但我真的很想看看一些方法来检查 if 的哪一部分是正确的.. 我们调试器并单击 QuickWatch 并粘贴您要比较的变量或使用命令窗口 @kopelence:方法是将if
表达式拆分成多个if
/elseif
。
当您有这么多条件时,最好将它们外包到 var aIsBiggerThanZero = a > 0;
等变量中,然后在您有 ìf(aIsBiggerThanZero || ...)
的情况下外包。然后,您可以在调试模式下轻松找出其中哪一个是正确的。而且你的代码更干净,因为变量解释了条件中检查的内容。
【参考方案1】:
当您不仅需要知道整体结果,还需要知道产生结果的项目true
的情况下,一种方法是将条件放入数组中,然后自己执行 OR 链||
s:
var conditions = new[] a > 0, b > 1, c > 2, d > 3;
var whichOne = Array.IndexOf(conditions, true);
if (whichOne >= 0)
Console.WriteLine("Condition number 0 is true", whichOne);
else
Console.WriteLine("The condition is false");
请注意,这种方法与||
链的不同之处在于它不会短路评估。换句话说,所有四个条件都将在调用 IndexOf
之前进行评估。
【讨论】:
这正是我想要的,谢谢! 这样做的一个重要副作用是,它确实消除了&&
和||
的短路行为。通常没什么大不了的,但对于if (x != null && x.SomeVal > 2)
之类的东西可能是个问题
@ScottChamberlain 这正是答案的最后两句话所说的:-)
我打算发布一个类似的答案,太好了! ;D
如果你想把它复杂化,你可以把这些条件设为Func<bool>
,然后你也可以短路:-)【参考方案2】:
在 C# 中没有直接的方法来实现这一点。它在 if 中进行评估,然后结果基本上被丢弃了。
您可以再次运行测试:
int a = 1, b, c, d;
if(a > 0 || b > 1 || c > 2 || d > 3)
if(a > 0)
// do special stuff
//do stuff
或者如果很贵,单独存放:
int a = 1, b, c, d;
bool aOverZero = a > 0;
if(aOverZero || b > 1 || c > 2 || d > 3)
if(aOverZero)
// do special stuff
//do stuff
或者只是对重复的代码使用另一种方法:
int a = 1, b, c, d;
if(a > 0)
// do special stuff
doStuff();
else if (b > 1)
// do special stuff
doStuff();
您选择哪一个取决于您的代码是什么、运行测试的成本是多少,以及是什么使它最易读。在这种情况下,显然夸大了它的简单程度,可读性将是最重要的问题。我可能会默认为第一个。在范围内引入一个完整的其他变量可能不值得。
【讨论】:
【参考方案3】:处理此问题的最佳方法是refactor the conditional to a polymorphic object (better example)。您将doStuff()
重构为父对象,然后为每个变量赋予其自己的对象。你在你的对象上调用doStuff()
,它完全删除了条件。您的对象会根据您正在测试的变量的值进行实例化。这样做的主要好处是您可以实现一次doStuff()
,并让每个子对象在调用super()
之前执行您需要它们执行的任何特殊行为。
【讨论】:
以上是关于C#如何检查if语句的哪一部分是正确的[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
因为某些原因。 IF 语句正在工作....我试过 If/else 也没有运气[关闭]
文件存在,如果语句检查,如果文件不存在,则不会返回正确的输出,C#