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

本文关键字:Dictionary 对象 安全 DirectoryInfo | 更新日期: 2023-09-27 18:12:17

我使用字典使用对象,如DirectoryInfo和FileInfo作为键。这样使用它们安全吗?如何确保对象类型可以安全地以这种方式使用?

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

一般来说,要确切知道它将如何运行的唯一方法是检查引用源。您可以检查文档,看看是否实现了IEquatable<T>(在这种情况下,您将得到"预期"的行为),以及。

如果所讨论的类型没有覆盖EqualsGetHashCode,则将使用任何对象的默认散列和相等。这意味着您可以使用它作为一个键,但是只有当您的查找是用类型的相同实例完成的,因为相等性默认情况下是System.Object的引用相等性。

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

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

让我们看看是不是这样!

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

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

您还可以从可用的源代码中看到GetHashCode没有被覆盖。

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