【发布时间】:2021-06-19 03:01:20
【问题描述】:
我正在尝试使用 MethodInfo 实例作为字典键,但我无法验证 .net 运行时是否很好地支持这一点。
更准确地说,给定两个RuntimeMethodInfo 实例m1 和m2,它们是从 .net 反射 API 获得的并且表示相同的方法。 .net 运行时是否始终保证m1.GetHashCode() == m2.GetHashCode() 和m1.Equals(m2)?
我可以在 stackoverflow 上找到同样的问题: Can MethodInfo be used as Dictionary key?
答案声称,是的,MethodInfo 可用于字典键。但是我无法验证此声明。
查看the source code of RuntimeMethodInfo,似乎GetHashCode() 的实现只是调用了RuntimeHelpers.GetHashCode() 的默认实现(当方法不是泛型时)。
如果我的理解是正确的RuntimeHelpers.GetHashCode(),只有在对象引用相同时才能保证返回相同的哈希码。
如果我的假设是正确的,这意味着 MethodInfo 不能安全地用作字典键,除非反射 API 始终保证为相同的给定方法返回相同的 MethodInfo 实例。是否有任何官方文件可以确认这一保证?
【问题讨论】:
-
您在寻找什么样的验证?在您的链接问题中发布已接受答案的用户是 Windows Master Ninja。如果你不相信他,你会接受什么?
-
你做过任何可以用来验证/反驳你论文的实验吗?
-
通过反射查询运行时的类型系统,它被大量缓存。是的,两个
GetMethod()调用将返回相同的实例。我不确定这是否记录在任何地方。 -
感谢您的回答!我确实注意到
GetMethod调用似乎产生了相同的MethodInfo实例,但我找不到任何官方来源可以确认这是由运行时保证的。例如,我可以想象这是旨在减少内存分配的优化的副作用。然后我的代码可能会因一些极端情况而中断。
标签: c# .net reflection