我在我正在处理的代码库中不断遇到这样的代码:
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)
,但是这可能会显示代码的年龄和我老板的时间框架。
答案 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);
}