由于没有先检查空值,旧版本的String.Equals的性能是否很差?

时间:2015-12-03 17:15:36

标签: c# .net .net-2.0 .net-1.1

我在我正在处理的代码库中不断遇到这样的代码:

private bool Equals(string s1, string s2)
{
    if (s1 == null && s2 == null)
        return true;

    else if (s1 != null && s2 == null)
        return false;

    else if (s1 == null && s2 != null)
        return false;

    else
        return s1.CompareTo(s2) == 0;
}

当我当时向我的经理询问我们为什么这样做而不是仅仅使用string.Equals(s1, s2)时,他表示这是比较字符串更快,性能更好的版本,因为它首先进行空检查。

这有什么道理吗?使用当前版本的.Net或旧版本?

代码库看起来像是使用.Net 1.1或2.0创建的,目前是3.5。我一直在寻找很多这些微观优化,这可能是也可能不是早期版本的.Net Framework的问题。

(关于s1.ComareTo(s2) == 0代码行,他声称相同的字符串有时会在内存中存在多次,并且错误的版本可用于比较字符串...我最终让他接受我改为使用string.Equals(s1, s2),但是这可能会显示代码的年龄和我老板的时间框架。

1 个答案:

答案 0 :(得分:0)

快速检查String当前 .NET源代码,表明肯定会检查空值。 EqualsHelper的代码也属于同一类。

编辑初始答案包含字符串实例版本的源代码。这是静态版本。无论版本如何,在调用EqualsHelper之前都会检查空值。

// Determines whether two Strings match.
[Pure]
public static bool Equals(String a, String b) {
    if ((Object)a==(Object)b) {
        return true;
    }

    if ((Object)a==null || (Object)b==null) {
        return false;
    }

    if (a.Length != b.Length)
        return false;

    return EqualsHelper(a, b);
}