0

我正在查看一些 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。

4

3 回答 3

0

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

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

不需要在第二个示例中的方法调用周围使用括号;这与省略它们没有什么不同,就像在第三个例子中一样。

于 2013-09-09T20:36:52.067 回答
0

string是 的别名System.String,所以这两者之间没有区别,类似于 howintInt32是同一件事。

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

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

于 2013-09-09T20:37:00.800 回答
0

一个潜在的问题可能是如果只有空格(例如“”)String.IsNullOrEmpty(str)会返回 false 。str如果您的逻辑想要将空格视为“空”,则您需要先修剪字符串。由于您可以提供的细节有限,无法判断这是否是实际问题,但仍然需要注意一些事情。

于 2013-09-09T20:49:08.290 回答