除了 .NET Framework 中的错误之外,还有其他解释吗?该EqualityComparer<Uri>.Default.Equals()
方法是说以下URL是相等的!
和
请注意第一个空格末尾的“s”后面的空格。
除了 .NET Framework 中的错误之外,还有其他解释吗?该EqualityComparer<Uri>.Default.Equals()
方法是说以下URL是相等的!
和
请注意第一个空格末尾的“s”后面的空格。
好吧,关注点(无论是对还是错)不在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
方法可能会有所帮助。
您看到的行为是设计使然。Uri
片段在其Equals
实现中被忽略,因为它们在技术上不是 URI 本身的一部分。您的Fragment
部分Uri
是“#v=onepage&q=fletcher”(# 符号及其后面的所有内容)。
您可以使用Uri
'sCompare
方法并指定UriComponents
要包含在比较中的内容。