C#中的布尔运算符和条件检查 - 优先顺序

时间:2013-09-09 20:31:28

标签: c# logic operator-precedence

我正在寻找一些C#源代码,试图跟踪一个错误并依赖我对编程和msdn的基本理解来解密,因为我没有使用它开发经验。在错误行为必须通过的关键点,我发现了以下内容:

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,则可能会发生我正在追踪的错误,即使它不应该也是如此。我想知道上面99%的时间会如预期的那样返回true或false,但是如果给出了特定的值(可能是0或字符串文字'NULL'等),则会返回false。

3 个答案:

答案 0 :(得分:0)

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

string只是System.String的别名。你使用哪个都没关系。

不需要在第二个示例中使用围绕方法调用的括号;与第三个例子中的省略没有什么不同。

答案 1 :(得分:0)

stringSystem.String的别名,因此这两者之间没有区别,类似于intInt32的相同之处。

否定语法也无关紧要,因为当使用额外括号时,它会对整个数量应用否定。如果它令人困惑或分散注意力,请将其移除,否则将其丢弃。

不幸的是,听起来你需要设置断点并遍历代码,直到找到逻辑错误的位置或者你正在处理的数据是错误的。您还可以考虑将Console调试语句放在3个关注的分支中,然后查看结果以查看数据采用的路径。

答案 2 :(得分:0)

如果String.IsNullOrEmpty(str)只是空格(例如“”),则str会返回false,这可能是一个潜在的问题。如果您的逻辑想要将空格视为“空”,则需要先剪裁字符串。用你能提供的有限细节来判断这是否是实际问题是不可能的,但要注意的是这一点。