DirectoryInfo对象可以安全地用作词典中的键吗?

时间:2014-07-09 18:23:13

标签: c# .net

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

3 个答案:

答案 0 :(得分:7)

一般而言,了解其行为方式的唯一方法是检查reference source。您可以查看文档以了解是否已实施IEquatable<T>(在这种情况下,您将获得&#34;预期&#34;行为)。

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

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

答案 1 :(得分:3)

要将它用作密钥,表示同一目录的两个DirectoryInfo对象具有相同的哈希码是有意义的。

让我们看看是不是这样!

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

哈希码不同。你可以使用它作为密钥,但它没有多大意义。使用完整路径会更好。

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

答案 2 :(得分:1)

通常情况下,当退出方法时,对象会被回收,但由于您已将它们添加到容器中,因此它们被固定在一起。在记忆中。因此,从这个意义上讲,他们是安全的。但是,如果外部代理删除文件或文件夹,则您有一个引用不存在的实体的对象。因此,在尝试与它们进行交互之前,请先测试它们是否存在。