Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.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# Type.GUID是否唯一标识编译中的每个类型?_C#_.net_Reflection_Types - Fatal编程技术网

C# Type.GUID是否唯一标识编译中的每个类型?

C# Type.GUID是否唯一标识编译中的每个类型?,c#,.net,reflection,types,C#,.net,Reflection,Types,可能重复: 我想使用Type作为关键字典,但我宁愿使用完整的Type名称或Type.GUID。对于此任务,Type.GUID的可靠性和正确性如何 写道: 您能否依赖System.Type.GUID保持稳定 所谓稳定,我的意思是它将在编译过程中为同一类型生成相同的值。经验证据表明情况确实如此,以下因素决定了类型的Guid: 类型名称(包括名称空间) 程序集名称 程序集公钥 反射到系统中,结果显示system.Type.GUID为 最终转换为对System.RuntimeType.GetGUI

可能重复:

我想使用
Type
作为关键字典,但我宁愿使用完整的Type名称或
Type.GUID
。对于此任务,
Type.GUID
的可靠性和正确性如何

写道:

您能否依赖System.Type.GUID保持稳定

所谓稳定,我的意思是它将在编译过程中为同一类型生成相同的值。经验证据表明情况确实如此,以下因素决定了类型的Guid:

  • 类型名称(包括名称空间)
  • 程序集名称
  • 程序集公钥
反射到系统中,结果显示system.Type.GUID为 最终转换为对System.RuntimeType.GetGUID的调用,这是 直接在中实现的可怕的InternalCall方法之一 运行时本身

我想知道


我认为使用Type.GUID作为字典的键不会产生问题。如果Guid不可靠,大多数COM组件将无法工作。

不要使用它

typeof(byte).GUID
00000000-0000-0000-0000-000000000000

typeof(int).GUID
00000000-0000-0000-0000-000000000000

typeof(short).GUID
00000000-0000-0000-0000-000000000000
经过测试,它们运行的是Mono 2.8

编辑:使用System.Reflection后,在各种(大型)程序集上我找不到两个GUI之间的冲突。因此,0-GUID问题似乎是单声道特有的。

来自位于的文档

Type.GUID
的目的是使用
[GUID(“…”)
获取与类关联的值。但是,当此属性未关联时,它也会返回guid。问题是从哪里来的。一个小测试表明guid是稳定的。我检查了一个类的guid,并验证在重命名该类时它是否已更改。当我重新命名该类时,我再次获得了原始guid。但是,由于这些guid是凭空出现的,因此不应该相信它们会随着时间、版本、框架版本等的变化而保持稳定。

或者它们可以满足您的需要。与GUID(与未知GUID相比,类型的有意义名称)相比,它还将大大简化调试

另一点是,该属性似乎没有很好的文档记录,所以我不会依赖它


编辑:您也可以使用
类型
实例本身作为键。

您应该动态地构建字典,每次都查找GUID,或者使用GuidAttribute类静态地设置GUID。你永远不应该依赖于没有保证的行为。

你能指出一个证实这一点的来源吗?@Oded只要你不坚持guid或metada会发生变化,我认为这是可以的。但是类型存在单个实例,因此可以通过引用相等性进行比较,所以最好将canditate作为字典键。我也想知道guid生成的内部结构。在什么条件下?什么CLR版本?在我的例子中(.NET 4使用LINQpad)我得到了非零的结果,但是不同的accross程序运行。我也得到了非零的结果(.NET 4,简单的控制台应用程序)。为什么我得到了不同的GUI?你怎么会全是零?我想知道为什么2张选票。。他们甚至没有进行简单的测试就投票了?我需要为当前二进制文件生成一个唯一的ID。我尝试了GUID,它在Windows上运行得很好,但在Mono上给出了这些0。这是很久以前的事了,但我相信我通过简单地对应用程序本身进行散列来获得唯一标识符,从而解决了这个问题。就我而言,这已经足够了。Type.FullName和Type.AssemblyQualifiedName都可以为null,具体取决于所需的上下文。@gimlichael,您的评论解决了一个重要问题。你有这样的例子吗?