除了作为.NET Framework中的错误之外,是否有其他解释? EqualityComparer<Uri>.Default.Equals()
方法表示以下网址相同!
和
注意第一个结尾处的空格后跟's'。
答案 0 :(得分:2)
嗯,关注(无论是对还是错)不在EqualityComparer<Uri>.Default
。它会调用Uri.Equals()
。
现在,Uri.Equals()
忽略了片段上的差异。在很多情况下这是恰当的。在许多人中并非如此。就我个人而言,我不会将它作为默认设置,但之后因为我不是编码它的人,或许我不知道有什么令人信服的理由可以按照原样进行操作。
请注意,这是记录在案的。
其他决策也值得商榷(它忽略了主机组件的大小写差异,与许多关于URI的实际问题相匹配,但在某些规范中没有定义URI相等性。)
如果你需要更严格的平等,我建议你定义自己的比较器:
public class UriStictEqualityComparer : IEqualityComparer<Uri>
{
public bool Equals(Uri x, Uri y)
{
return ReferenceEquals(x, y)
||
(
x != null
&&
y != null
&&
x.IsAbsoluteUri == y.IsAbsoluteUri
&&
x.ToString() == y.ToString()
);
}
public int GetHashCode(Uri obj)
{
return obj == null ? 0 : obj.ToString().GetHashCode();
}
}
尽管如此,你可能会发现你想要一些上述认为不平等的情况,也是相同的。例如。你需要考虑punycode和非punycode版本是否相同,是否应该转义转义的非特殊字符,等等。在这种情况下,Uri的Compare
方法可能是有益的。
答案 1 :(得分:1)