【问题标题】:Can a DirectoryInfo object be safely use as a key in a Dictionary?DirectoryInfo 对象可以安全地用作字典中的键吗?
【发布时间】:2014-07-09 18:23:13
【问题描述】:

我正在使用 Dictionary 使用 DirectoryInfo 和 FileInfo 等对象作为键。以这种方式使用它们是否安全?如何确保可以安全地以这种方式使用对象类型?

【问题讨论】:

  • 嗨丹尼尔,我个人不明白你为什么使用目录信息或文件信息作为键。我个人用来设置键并将字典设置为字典(字符串,对象)。可能显示我们一点点代码,以便更好地理解你为什么这样做?
  • 在此上下文中定义“安全”。您的期望是什么?
  • stackoverflow.com/questions/18653083/… 抱歉,但是当通过 MSDN 等进行搜索时,我经常惊讶地发现这里有多少问题会给出答案。我想如果是我,我实际上只是编写代码并找出它是如何工作的——这就是所谓的编程。不想抨击任何人,但我在 stackoverflow 中到处都看到类似的问题,我想知道为什么会有这么多重复
  • 编程也是为了写出稳定的代码。如果您依赖未记录但已观察到的行为,则无法确定您的代码似乎可以工作多长时间。编写GetHashCode 实现时的“规则”之一是,每次在同一个对象实例上调用该方法时,都应该得到相同的值。在这方面,使用特定的DirectoryInfo 对象作为键是安全的。如果您希望围绕同一路径字符串构建的两个对象可以作为键互换,文档声明不,您不能依赖它,并且观察到的行为支持这一点。

标签: c# .net


【解决方案1】:

一般来说,确切知道其行为方式的唯一方法是检查reference source。您也可以查看文档以查看是否实现了 IEquatable<T>(在这种情况下,您将获得“预期的”行为)。

如果有问题的类型没有覆盖EqualsGetHashCode,则将使用任何对象的默认散列和相等性。这意味着您可以将其用作键,但前提是您的查找是使用 该类型的相同实例完成的,因为默认情况下相等是 System.Object 的引用相等。

在这种情况下,DirectoryInfo 和相关类不会覆盖这些方法,这意味着您将获得对象的默认相等和散列,这可能不是您想要的。相反,我建议使用 FullName 属性作为键,因为它是一个 string 并提供了在字典中使用的正确相等语义。

【讨论】:

  • 正确的方法是查看文档。除非行为记录在案,否则不应依赖它。
  • @LasseV.Karlsen 不幸的是,文档(据我所见)并没有一致地指定事情是否覆盖EqualsGetHashCode。您可以检查它是否实现了IEquatable<T>,但这是框架中的文档似乎缺乏的一个地方。
  • DirectoryInfo 的文档明确表示 GetHashCode 继承自 ObjectObject.GetHashCode 的文档明确表示它不保证唯一性或一致性。
  • 总有参考来源可以确认! referencesource.microsoft.com/#mscorlib/system/io/…
  • @Tab 不可能。
【解决方案2】:

如果要将其用作键,则表示同一目录的两个 DirectoryInfo 对象具有相同的哈希码是有意义的。

让我们看看是不是这样!

new System.IO.DirectoryInfo(@"C:\").GetHashCode(); // 25422474
new System.IO.DirectoryInfo(@"C:\").GetHashCode(); // 48007696

哈希码不同。您可以将它用作键,但它没有多大意义。最好使用完整路径。

您还可以从available sources 中看到GetHashCode 未被覆盖。

【讨论】:

    【解决方案3】:

    通常,当方法退出时,对象会被回收,但由于您已将它们添加到容器中,它们被“固定”在内存中。所以从这个意义上说,他们是安全的。但是,如果外部代理删除了文件或文件夹,那么您将拥有一个引用不存在实体的对象。因此,在尝试与它们交互之前测试它们是否存在。

    【讨论】:

      猜你喜欢
      • 2021-06-19
      • 2011-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-25
      • 1970-01-01
      • 2016-06-03
      • 2011-04-28
      相关资源
      最近更新 更多