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#

是否有任何规则可以在条件/案例表达式中使用sql语句子句的哪一部分?

检查执行if语句的时间

带有 2 个变量和 4 个条件的 IF 语句

C#中if语句的基本运用