![](/img/trans.png)
[英]EqualityComparerer<T>.Default.Equals() vs object.Equals() and polymorphism
[英]EqualityComparer<Uri>.Default.Equals() returning wrong result or what?
除了作為.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本身的一部分。 Uri
的Fragment
部分是“#v = onepage&q = fletcher”(#符號及其后的所有內容)。
您可以使用Uri
的Compare
方法並指定要包含在比較中的UriComponents
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.