如果说My.Application、My.Computer和My.User是VB2005提供的汇集常用功能的类库,My.Resources是一个对项目资源的强类型封装,那么My.Forms和My.WebServices就是一个窗体和Web服务使用模式的绝佳范例。从VB6升级至Visual Basic .NET的程序员往往对VB.NET新的窗体编程模式不适应。因为VB.NET的窗体是类,必须要创建实例才能使用,而VB6的窗体则既是类又是对象,无须创建实例就能使用。在VB.NET中,往往要用这样的语法来使用窗体:
Dim frmForm2 As New Form1()
frmForm2.Show
然而用这样的语法显示窗体,各个窗体之间的通信或数据传递就十分困难。比如新生成的frmForm2要想访问另一个窗体Form1就难以做到,因为frmForm2无法获得Form1实例的引用。许多初学者在使用窗体的时候弄不清类、实力和引用之间的关系因此常常遇到苦难。即使熟悉了这些概念,有时仍不能用正确的方法解决窗体互相访问的问题。许多解决方案,如通过构造函数传递数据,通过全局变量或者静态变量,甚至在模块中生成项目中所有窗体的实例等等都不是十分理想,他们会增加窗体之间的耦合性,或者浪费内存。为了彻底解决窗体创建和互相访问的问题,Visual Basic 2005引入了My.Forms。My.Forms虽然在My命名空间中,但是使用它不需要输入My.Forms。假设你有两个窗体——Form1和Form2,Form1是启动窗体,现在你要用代码显示Form2,新的语法是这样的:
Form2.Show
这种用法和VB6几乎一样。Form2是窗体的类,怎么可以直接使用了呢?因为My.Forms为项目中每一个窗体维护了一个默认实例,其实现方法很像Singleton模式——每个窗体都有一个默认实例,而且有一个全局访问点,就通过窗体的类名即可访问到。这种方式彻底解决了窗体互相访问的问题,因为每个窗体都可以随时访问到任何其它的窗体的默认实例。比如要在Form2中修改Form1中一个TextBox的文字,只需要这样:
Form1.textBox1.Text = "Hello"
不在需要任何传递参数的构造函数或者静态/全局变量。一个项目中多数窗体都是只需要一个实例的,所以这种模式适合任何项目使用。无论是新手或老手,我都建议尽情使用My.Forms的功能,他是解决窗体互访的最佳模式,同时不会浪费内存,因为它只有在第一次访问所需窗体的时候才建立它。
My.WebServices的原理与My.Forms如出一辙,因为原来WebService的代理类都需要手工创建对象才能使用。而WebService对于项目全局应该有一个一致的访问点,所以VB2005将代替你创建代理类的实例,并维护于My.WebServices中,你可以随时访问他。比如你的项目添加了一个Web引用到Service1服务,它提供了一个方法叫Method1,以前的Visual Basic你必须写成:
Dim myService1 As New Service1()
Dim myResult As Integer = myService1.Method1()
而现在,无论在何地,你都可以直接写:
myResult = My.WebServices.Service1.Method1()
而无须手工创建代理类的对象了。
到今天为止,我已经介绍了My命名空间中的六个主要的功能区域,还剩下一个My.Settings,由于它在目前的BETA版本中还有缺陷,所以我将在以后找机会介绍它。下一次,我将介绍如何在C#和其他语言中使用My命名空间,以及如何通过编程扩展My命名空间的功能。