GUID属性的必要性是什么?为什么不让编译器自动处理?!为什么首先需要GUID属性?
回答
如果编译器自动处理它,你最终会遇到以下两种情况之一。
每次编译时新的GUID - 因为GUID应该发布,所以这会失败。冲突 - 如果GUID每次都是相同的,基于(比如说)哈希名称,多个项目最终会使用相同的GUID用于不同的目的。
现有方法 - 明确的GUID使开发人员能够根据需要控制这些方法。
有时候你想给某些类或模块一个唯一的标识符,这个标识符在源代码中是固定的和硬编码的。
你可以这样做(只是省略属性),但是编译器会在每次重新编译时都会生成一个新的GUID,即使接口没有改变。这是不幸的,因为该接口的用户不知道有关更改,并将检索通过它的旧GUID的接口,因此将无法检索它。
这些属性对COM很重要。这是.NET的前身,在九十年代Java抢尽风头之前就有了鼎盛时期。 .NET需要与COM兼容才能获得成功。换句话说,您需要能够使用.NET语言编写COM服务器,这是一个大型的传统程序可以使用的。
[ComVisible]属性确保COM客户端程序可以看到并使用IEnumerable接口。必须允许客户端程序枚举.NET集合。
[Guid]属性在COM中至关重要,它标识了一个接口。这是通过guid而不是名称来完成的,以确保它在由不同程序员编写的多个应用程序中是唯一的。 .NET也有这个,但是使用一个名字来使它更容易在人类身上。 “System.Collections.IEnumerable,mscorlib,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089”。
IEnumerable <>,通用版本没有[Guid]。泛型与COM不兼容。这些日子并不重要,周围没有太多可见的COM,大部分已经被友好的.NET类包装了。但在Windows中仍然非常重要,特别是在全新的WinRT(又名Metro)中。你也不要直接使用它,使COM有点像Windows编程的汇编语言。
要阅读此定义,您需要查看每个属性的含义。第一个,ComVisibleAttribute
描述为:
控制对COM中单个托管类型或成员或程序集中所有类型的可访问性。
这告诉我们ComVisible
与COM有关,可以让我们指定某个特定类型是否对COM程序可见。进一步在页面上的链接是关于属性是什么以及类型库导出器如何使用它的更多细节的链接。
第二,GuidAttribute
,是有点不太有用起初:
提供一个明确的System.Guid时自动GUID是不可取的
但同样,你必须阅读休息一路下来,你会看到另一种类型库出口商。
把这两个放在一起,它开始变得清晰,这两个属性控制着如何导出到一个类型库时处理IEnumerator
。如果你不知道类型库是什么,这可能对你没有多大意义。如果你不使用COM互操作,那么这些属性可以安全地被忽略。如果您使用COM interop的为,则需要知道Guid
才能从非托管COM代码正确访问该接口。
微软将这些放在每个接口定义上,以防需要它们;阅读MSDN页面的一部分技能是识别这种类型的信息并知道它何时对你没有任何用处。现在你知道这两个属性的用途了,你应该能够弄清楚它们是否与你有关,否则就忽略它们。
- 1. 为什么windbg命令首先。要么 !
- 2. AttributeError:为什么模块首先导入不注册为属性?
- 3. 为什么在这个Linq-To-Xml查询中首先需要?
- 4. 为什么需要使用OnModelCreating(首先是MVC 5 EF代码)?
- 5. 为什么我甚至需要首先序列化?
- 6. 组合框需要什么属性?
- 7. EntityFramework Code首先对属性获取者/设置者做什么?
- 8. 为什么返回值需要是NRVO首先声明的本地值?
- 9. 为什么我需要将此指针作为属性?
- 10. 为什么我们需要为公共领域添加属性?
- 11. 为什么它首先调用bool_function?
- 12. 实体框架TPC:为什么BaseEntity ID需要是Guid类型?
- 13. 为什么{{}}在src属性中不起作用?为什么我需要ngSrc?
- 14. 为什么代码首先要创建索引列?
- 15. 为什么要优先
- 16. Jquery首先加载什么
- 17. 什么首先执行?
- 18. 为什么一个类需要数据合同属性,另一个不需要
- 19. 在Java中,为什么某些变量首先需要初始化,其他变量只需要声明?
- 20. Git Fast-Forward Merge需要首先拉动
- 21. 为什么NSCell不赞成使用,为什么首先推出?
- 22. 为什么Java中需要易失性
- 23. 为什么我们需要在C#属性
- 24. 为什么Code First类需要导航属性?
- 25. 为什么我不需要这个Core Data属性的ivar?
- 26. 需要帮助调试为什么没有设置属性/ null
- 27. 为什么定制xib需要UIView属性
- 28. 为什么我想模拟的属性需要虚拟?
- 29. 为什么自动属性需要getter和setter?
- 30. 为什么ViewModel需要实现INotifyPropertyChanged或使用依赖属性?
因此,手动使用该属性的“健康习惯”,还是只在某些情况下才需要? – Nissim 2009-07-01 06:35:21