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类型提升失效,而您没有完全限定该成员,则无意中可能会访问另一个编程元素。

网页标题:VB.NET类型提升失效问题总结
网站网址:http://www.shufengxianlan.com/qtweb/news41/548691.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联