代码之家  ›  专栏  ›  技术社区  ›  Adrian

为什么在equals方法中忽略了URI的片段?

  •  5
  • Adrian  · 技术社区  · 15 年前

    我正在尝试根据对象的URI维护对象集合:

    public class ConceptCollection : KeyedCollection<Uri, Concept> {
        protected override Uri GetKeyForItem(Concept item) {
            return item.Uri;
        } 
    }
    

    但是,URI通常只根据URI的片段而不同。因此,以下内容会导致错误:

    ConceptCollection wines = new ConceptCollection();
    Concept red = new Concept("http://www.w3.org/2002/07/owl#RedWine");
    Concept white = new Concept("http://www.w3.org/2002/07/owl#WhiteWine");
    wines.Add(red);
    wines.Add(white); // Error: An item with the same key has already been added.
    

    http://msdn.microsoft.com/en-us/library/f83xtf15.aspx :

    equals方法比较两种方法 不考虑用户的实例 信息(userinfo)和片段( 碎片)他们可能 包含。例如,给定uri http://www.contoso.com/index.htm#search http://user:password@www.contoso.com/index.htm , equals方法将返回true。

    我已经听天由命了。但为什么会这样呢?我可以看到用户信息的逻辑,但不能看到片段。

    2 回复  |  直到 15 年前
        1
  •  9
  •   Scott Dorman    15 年前

    RFC 2396 :

    4.1。片段标识符

    当使用uri引用对已标识的资源执行检索操作时,可选的片段标识符(通过交叉线(“”)字符与uri分隔)包含用户代理在 检索操作已成功完成。 因此,它不是URI的一部分,但通常与URI一起使用。

    添加的重点是我的,这也是在uri.equals实现中不考虑该片段的原因。

    在您的示例中,您正在检索的资源的URI是: http://www.w3.org/2002/07/owl

    这些片段由用户代理处理,对资源的实际检索没有意义或影响。

        2
  •  0
  •   Luke Sampson    15 年前

    我猜是因为除了片段之外相同的2个URI仍然引用相同的资源,只是资源中的一个不同的位置。

    所以如果你问“这些是同一种资源吗?”然后你可以争辩说忽略片段是正确的。