C#阶存在的布尔算子与条件检验
我正在看一些C源代码,试图追踪一个bug,并依靠我对编程和msdn的基本理解来破译,因为我没有开发它的经验。在buggy行为必须经过的关键点上,我发现了以下内容: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
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>一个潜在的问题可能是