VB.NET类型提升失效问题总结

开发 后端
VB.NET类型提升之后,可以实现限定字符串而不需要包括模块名称。不过,在进行提升的过程中通常会出现失效的状态,在这里就对此进行了一个详细的介绍。

VB.NET是一款运行机制和Java类似的编程语言。其具有面向对象特性,能够支持代码托管,而且界面简单,结构稳定,为开发人员带来了极大的好处。在这里我们会通过对VB.NET类型提升的一些相关问题的解疑,来对这门语言进行深入的研究。

在模块中声明编程元素时,VB.NET会将其范围提升到包含该模块的命名空间。这称为VB.NET类型提升。

下面的示例演示某个模块和该模块的两个成员的主干定义。

  1. Namespace projNamespace  
  2. Module projModule  
  3. Public Enum basicEnum As Integer  
  4. one = 1 
  5. two = 2 
  6. End Enum  
  7. Public Class innerClass  
  8. Public Sub numberSub(ByVal firstArg As Integer)  
  9. End Sub  
  10. End Class  
  11. End Module  
  12. End Namespace 

在 projModule 中的模块级别上声明的编程元素将被提升到 projNamespace。在前面的示例中,提升了 basicEnum 和 innerClass,但是没有提升 numberSub,因为它不是在模块级别上声明的。

VB.NET类型提升的结果

类型提升的结果是一个限定字符串不需要包括模块名称。下面的示例对前面示例中的过程发出两个调用。

  1. Sub usePromotion()  
  2. projNamespace.projModule.innerClass.numberSub
    (projNamespace.projModule.basicEnum.one)  
  3. projNamespace.innerClass.numberSub(projNamespace.basicEnum.two)  
  4. End Sub 

在前面的示例中,***个调用使用完全限定字符串。但由于进行了类型提升,因此这不是必需的。第二个调用也访问模块的成员,但在限定字符串中不包括 projModule。

VB.NET类型提升的失效

如果命名空间中的成员与某个模块成员同名,则对该模块成员的类型提升将会失效。下面的示例演示同一命名空间中枚举和模块的主干定义。

  1. Namespace thisNamespace  
  2. Public Enum abc  
  3. first = 1 
  4. second  
  5. End Enum  
  6. Module thisModule  
  7. Public Class abc  
  8. Public Sub abcSub()  
  9. End Sub  
  10. End Class  
  11. Public Class xyz  
  12. Public Sub xyzSub()  
  13. End Sub  
  14. End Class  
  15. End Module  
  16. End Namespace 

在前面的示例中,Visual Basic 无法将类 abc 提升到 thisNameSpace,因为在命名空间级别上已存在同名的枚举。若要访问 abcSub,必须使用完全限定字符串 thisNamespace.thisModule.abc.abcSub。但是,仍会提升 xyz 类,您可以使用较短的限定字符串 thisNamespace.xyz.xyzSub 来访问 xyzSub。

分部VB.NET类型提升的失效

如果模块内的类或结构使用分部 (Visual Basic) 关键字,则对该类或结构的类型提升会自动失效,无论命名空间是否具有同名的成员。模块中的其他元素仍然符合类型提升的条件。

结果。 分部定义的类型提升失效可能导致意外的结果,甚至导致编译器错误。下面的示例演示类的主干分部定义,其中一个定义位于模块内。

  1. Namespace sampleNamespace  
  2. Public Partial Class sampleClass  
  3. Public Sub sub1()  
  4. End Sub  
  5. End Class  
  6. Module sampleModule  
  7. Public Partial Class sampleClass  
  8. Public Sub sub2()  
  9. End Sub  
  10. End Class  
  11. End Module  
  12. End Namespace 

在前面的示例中,开发人员可能期望编译器合并 sampleClass 的两个分部定义。但是,编译器不考虑 sampleModule 内分部定义的提升。因此,它尝试编译两个名称均为 sampleClass 但具有不同限定路径的不同类。#t#

只有在两个分部定义的完全限定路径相同时,编译器才会对这两个分部定义进行合并。

建议

下面的建议提供了良好的编程做法。

***名称。 当您可以完全控制编程元素的命名时,在所有位置使用***名称始终是一个好办法。相同的名称需要额外的限定,并可能使代码难以阅读,还可能导致难以发现的错误和意外的结果。

完全限定。 当您在同一命名空间中使用模块和其他元素时,最安全的方法是对所有编程元素始终使用完全限定。如果某个模块成员的VB.NET类型提升失效,而您没有完全限定该成员,则无意中可能会访问另一个编程元素。

责任编辑:曹凯 来源: wewill.cn
相关推荐

2009-10-27 14:32:45

VB.NET类型级命名

2009-11-10 16:37:48

VB.NET ANY

2010-01-07 14:10:41

VB.NET数据类型

2009-11-10 13:08:13

VB.NET编程技巧

2009-11-02 13:14:18

VB.NET函数

2010-01-20 17:54:13

VB.NET特殊字符

2009-10-28 09:21:19

VB.NET技术

2009-11-03 10:51:33

VB.NET共享

2010-01-12 16:39:26

VB.NET数据绑定

2009-10-13 14:38:10

VB.NET访问类型

2010-01-15 10:47:15

VB.NET命名空间

2010-01-18 16:49:36

VB.NET基本数据类

2009-10-09 17:40:38

VB.Net问题集

2009-10-27 09:45:03

VB.NET数组

2010-01-08 16:19:00

VB.NET类型单位命

2009-10-13 16:05:07

VB.NET字符数据类

2009-10-28 14:44:43

VB.NET Name

2009-10-15 13:06:12

VB.NET Shar

2010-01-20 18:51:16

VB.NET修改系统时

2009-10-23 09:26:09

VB.NET多线程
点赞
收藏

51CTO技术栈公众号