C#阶存在的布尔算子与条件检验

C#阶存在的布尔算子与条件检验,c#,logic,operator-precedence,C#,Logic,Operator Precedence,我正在看一些C源代码,试图追踪一个bug,并依靠我对编程和msdn的基本理解来破译,因为我没有开发它的经验。在buggy行为必须经过的关键点上,我发现了以下内容: public static bool isObjectSpecialCheck(object someObject) { string someParam = getParam(someObject); if (String.IsNullOrEmpty(someParam)) { somePar

我正在看一些C源代码,试图追踪一个bug,并依靠我对编程和msdn的基本理解来破译,因为我没有开发它的经验。在buggy行为必须经过的关键点上,我发现了以下内容:

public static bool isObjectSpecialCheck(object someObject)
{
    string someParam = getParam(someObject);
    if (String.IsNullOrEmpty(someParam))
    {
        someParam = getParamSomewhereElse(someObject);
    }
    if (!(string.IsNullOrEmpty(someParam)))
    {
        try
        {
            if (!string.IsNullOrEmpty(paramIsSpecial(someParam)))
                return (true);
            else
                return (false);
        }
        catch (System.Exception ex)
        {
            GlobalConstants.Log(log, "Error", "isObjectSpecialCheck", ex);
            return (false);
        }
    }
    return (false);
}
我用假人替换了原始变量,试图使问题保持抽象。我注意到,
.isNullOrEmpty
有三种不同的用法:

  • if(String.IsNullOrEmpty(someParam))

  • if(!(string.IsNullOrEmpty(someParam))

  • if(!string.IsNullOrEmpty(paramIsSpecial(someParam)))

第一个使用
String
作为类型,第一个字母大写,不使用否定

第二个函数在括号外有一个否定式,它只将定义的变量传递给方法

第三个函数在表达式旁边有一个否定式,
IsNullOrEmpty
被传递一个函数

所以我想我的问题是:这些区别在总体上有区别吗?在上述代码中,它们似乎是必需的/有意的吗?如果它们确实略有不同,但上述选择似乎是来自不同贡献者的样式选择,那么可能导致的潜在逻辑错误是什么


如果上面的错误总是返回true,那么我正在跟踪的错误可能会发生,即使它不应该返回true。我想知道,如果给定特定的值(可能是0或字符串文字“NULL”,等等),上面的99%的时间是否会像预期的那样返回true或false,但会返回false true。

显然,如果存在或缺少否定运算符,这很重要。其他差异都不相关

string
只是
System.string
的别名。你用哪一种并不重要


在第二个示例中,不需要在方法调用周围使用括号;这与省略它们没有什么区别,如第三个示例中所示。

string
System.string
的别名,因此这两者之间没有区别,类似于
int
Int32
是一回事

否定语法也不重要,因为当使用额外的括号时,它将否定应用于整个数量。如果它令人困惑或分心,请将其移除,否则请保留在其中


不幸的是,听起来您需要设置断点并遍历代码,直到您发现逻辑错误或正在处理的数据错误。您还可以考虑在3个关注的分支中设置<代码>控制台< /代码>调试语句,然后查看结果以查看您的数据正在占用哪些路径。

< P>一个潜在的问题可能是字符串。IsNullOrEmpty(STR)如果“代码> STR 仅是空白(Ex.)),将返回false。如果您的逻辑想要将空格视为“空”,那么您应该首先修剪字符串。由于您所能提供的详细信息有限,无法判断这是否是实际问题,但仍然需要注意。

此方法返回true的唯一情况是当方法paramIsSpecial返回false时,因此我将研究该方法的返回值是如何形成的。(字符串和字符串是同一件事,布尔值的求反与其他任何编程语言一样有效)。第三种情况下的IsNullOrEmpty也接收paramIsSpecial的返回值,而不是函数的返回值