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