我正在寻找一些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。
答案 0 :(得分:0)
显然,如果否定运算符存在或缺失则很重要。其他差异都不相关。
string
只是System.String
的别名。你使用哪个都没关系。
不需要在第二个示例中使用围绕方法调用的括号;与第三个例子中的省略没有什么不同。
答案 1 :(得分:0)
string
是System.String
的别名,因此这两者之间没有区别,类似于int
和Int32
的相同之处。
否定语法也无关紧要,因为当使用额外括号时,它会对整个数量应用否定。如果它令人困惑或分散注意力,请将其移除,否则将其丢弃。
不幸的是,听起来你需要设置断点并遍历代码,直到找到逻辑错误的位置或者你正在处理的数据是错误的。您还可以考虑将Console
调试语句放在3个关注的分支中,然后查看结果以查看数据采用的路径。
答案 2 :(得分:0)
如果String.IsNullOrEmpty(str)
只是空格(例如“”),则str
会返回false,这可能是一个潜在的问题。如果您的逻辑想要将空格视为“空”,则需要先剪裁字符串。用你能提供的有限细节来判断这是否是实际问题是不可能的,但要注意的是这一点。