Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MethodInfo可以安全地用于字典键吗?_C#_.net_Reflection - Fatal编程技术网

C# MethodInfo可以安全地用于字典键吗?

C# MethodInfo可以安全地用于字典键吗?,c#,.net,reflection,C#,.net,Reflection,我试图使用MethodInfo实例作为字典键,但我无法验证.net运行时是否很好地支持这一点 更准确地说,给定两个RuntimeMethodInfo实例m1和m2,它们是从.net反射API获得的,表示相同的方法。net运行时是否总是保证m1.GetHashCode()==m2.GetHashCode()和m1.Equals(m2) 我可以在stackoverflow上找到同样的问题: 答案是肯定的,MethodInfo可以用于字典键。然而,我无法证实这一说法 现在来看,GetHashCode(

我试图使用
MethodInfo
实例作为字典键,但我无法验证.net运行时是否很好地支持这一点

更准确地说,给定两个
RuntimeMethodInfo
实例
m1
m2
,它们是从.net反射API获得的,表示相同的方法。net运行时是否总是保证
m1.GetHashCode()==m2.GetHashCode()
m1.Equals(m2)

我可以在stackoverflow上找到同样的问题:

答案是肯定的,
MethodInfo
可以用于字典键。然而,我无法证实这一说法

现在来看,
GetHashCode()
的实现似乎只是调用
RuntimeHelpers.GetHashCode()
的默认实现(当方法不是泛型时)

如果我的理解是正确的
RuntimeHelpers.GetHashCode()
,则只保证在对象引用相同时返回相同的哈希代码


如果我的假设是正确的,这意味着
MethodInfo
不能安全地用作字典键,除非反射API始终保证为相同的给定方法返回相同的
MethodInfo
实例。是否有任何官方文件可以证实这一保证?

我认为最好的选择是检查C#标准和文件。至于文档,对于GetMethod的返回值没有任何保证。因此,相同的调用是否会返回MethodInfo的相同或不同实例是特定于实现的。方法信息是否等于不同的实例,描述相同的方法真的相等或不相等?在文档中也没有明确的保证,所以我更愿意考虑这也是具体的实现。
Resume:对于POC/MVP,您可以使用MethodInfo作为键,因为当前的实现完成了将其作为键使用所需的全部工作。但对于任何长期存在的/跨平台的/etc项目,我建议不要使用MethodInfo作为键,因为行为在将来可能会改变,或者今天可能已经不同了,但对于其他运行时来说。

您需要什么样的验证?在链接问题中发布已接受答案的用户是Windows忍者大师。如果你不相信他的话,你会接受什么?你做过任何可以用来验证/混淆你的论点的实验吗?通过反射,你可以查询运行时的类型系统,它被大量缓存。是的,两个
GetMethod()
调用将返回相同的实例。但我不确定这是否有任何记录。谢谢你的回答!我确实注意到,
GetMethod
调用似乎产生了相同的
MethodInfo
实例,但我找不到任何官方来源可以证实这是由运行时保证的。例如,我可以想象这是旨在减少内存分配的优化的副作用。我的代码可能会因一些角落的案例而中断。