类型.GUID 是否跨编译唯一标识每种类型



可能的重复项:
为 .NET 中的类型自动生成的 GUID 是否一致?

我想使用 Type 作为密钥字典,但我宁愿使用完整类型名称或 Type.GUID .这项任务的可靠性和正确性Type.GUID如何?

Ayende Rahien写道:

你能依靠System.Type.GUID来稳定吗?

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

  • 类型名称(包括命名空间(
  • 程序集名称
  • 程序集公钥

反射到系统中,事实证明System.Type.GUID是最终转换为对System.RuntimeType.GetGUID的调用,这是直接在 中实现的可怕的 InternallCall 方法之一运行时本身。

我想知道...

来自 http://msdn.microsoft.com/en-us/library/system.type.guid.aspx 的文档。

Type.GUID的目的是使用 [Guid("...")] 获取与类关联的值。但是,当此属性未关联时,它还返回 guid。问题是它从哪里得到这个。一个小测试表明 GUID 是稳定的。我检查了一个类的 GUID,并验证了当我重命名该类时它是否发生了变化。当我将类重命名回来时,我再次获得了原始 guid。但是,由于这些 guid 是凭空出现的,因此不应信任它们在时间、版本、框架版本等过程中是稳定的。

不要使用它。

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

在 ideone.com 上测试,他们运行Mono 2.8

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

Type.FullName 或 Type.AssemblyQualifiedName 可以满足您的需求。此外,与 GUID(与未知 GUID 相比,有意义的类型名称(相比,它将大大简化调试。

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

编辑:您也可以使用 Type 实例本身作为密钥。

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

应动态生成字典,每次查找 GUID,或者应使用 GuidAttribute 类静态设置 GUID。你永远不应该依赖无法保证的行为。

相关内容

  • 没有找到相关文章

最新更新