【发布时间】:2012-01-15 05:21:06
【问题描述】:
我正在使用字符串比较来测试使用 StringComparison.OrdinalIgnoreCase 的 URL 路径。
MSDN 给出了以下字符串比较建议HERE,但没有说明WHY:
MSDN 示例(上一页的一半):
public static bool IsFileURI(string path)
{
path.StartsWith("FILE:", StringComparison.OrdinalIgnoreCase);
return true;
}
MSDN 建议:
"但是,前面的示例使用 String.StartsWith(String, StringComparison) 方法来测试是否相等。因为比较的目的是测试是否相等而不是对字符串进行排序,所以更好的替代方法是调用 Equals方法,如下例所示。”
public static bool IsFileURI(string path)
{
if (path.Length < 5) return false;
return String.Equals(path.Substring(0, 5), "FILE:",
StringComparison.OrdinalIgnoreCase);
}
问题:为什么 MSDN 建议第二个示例更好?
讨论点:
很明显,第一个示例中的
return true;是一个错误,应该是return path.StartsWith(...);。 由于 VB 代码是正确的,我们可以放心地忽略这个错误。在比较相等性之前创建子字符串似乎只使用另一个内存资源,而不仅仅是调用 String.StartsWith()。
Length
第二个示例可以解释为更清晰的代码,但我关心的是性能。子字符串的创建似乎没有必要。
【问题讨论】:
-
基于
StartsWith示例函数没有意义的事实,我将采用该示例最初使用不同函数(如CompareTo)的想法,并且有人改变了不注意上下文就随意采样。 -
我发现“startswith”在表达你的意图时要清晰得多。
-
@Gabe 你能就一般性问题发表意见吗?使用 StartsWith 似乎对我来说更可取。为比较创建一个子字符串似乎效果不太好。
-
@I82Much - 我同意,在我看来,使用
StartsWith的代码更简洁(一旦修复了其中的错误)。我认为这里的可能性是 1) 微软说StartsWith已完全损坏,不应该被使用,或者 2) 有人对旧/预先存在的文章进行了粗心的修改,以这样的方式更改它不再有意义。 -
@KevinR:
StartsWith方法通常更可取,因为它们最终都会调用相同的内部函数InternalCompareStringOrdinalIgnoreCase。唯一真正的区别是Equals有一个优化的情况,其中两个字符串都是 ASCII。