可能的重复项:
为 .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。你永远不应该依赖无法保证的行为。