装配中的脑袋

用程序装配大脑,再用大脑装配程序
随笔 - 118, 评论 - 1214, 引用 - 11

导航

工具

关于

如果想发较大的信件,请用Ninputer @ gmail.com

不要在我的Blog评论中张贴广告,除非同意向我付款。

标签

每月存档

广告



访客

 

如果说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命名空间的功能。


随贴广告(测试期)
相关文章

打印 | 张贴于 2004-08-07 19:35:00 | Tag:技术随笔  Visual Basic 2005 新功能点评

留言反馈

回复: Visual Basic 2005新功能点评(十七)——My命名空间之My.Forms和My.WebServices 编辑
多谢.又好好的学了一课.一直用C#,没有注意VB2005居然有这么爽的功能.
2007-11-09 12:02:00 | [匿名用户:hancat]
re: Visual Basic 2005新功能点评(十七)——My命名空间之My.Forms和My.WebServices 编辑
为什么在ASP.NET里面没有办法适用My.WebServices
2006-04-05 14:21:00 | [匿名用户:HashMap]
re: Visual Basic 2005新功能点评(十七)——My命名空间之My.Forms和My.WebServices 编辑
不会啦,这些窗体都是在第一次使用的时候创建。
2004-12-27 20:36:00 | [匿名用户:Ninputer]
re: Visual Basic 2005新功能点评(十七)——My命名空间之My.Forms和My.WebServices 编辑
师兄我再问一个问题:
以前在VB.NET2003的程序中写一个窗体类,可能在程序运行时根本就不会创建它的实例。而现在My.Forms为每个窗体都自动创建了一个默认实例,如果某个实例在某一次程序中被用到的可能性很低,那么,从概率的角度看,这样会不会比较浪费内存呢?
不知道我把我问题表达清除了没有。
2004-12-25 23:30:00 | [匿名用户:疯牛涕淌]
re: Visual Basic 2005新功能点评(十七)——My命名空间之My.Forms和My.WebServices 编辑
@疯牛涕淌

这是一个新特性,请看我的文章——VB2005新功能点评之不完全类型
2004-12-25 16:23:00 | [匿名用户:Ninputer]
re: Visual Basic 2005新功能点评(十七)——My命名空间之My.Forms和My.WebServices 编辑
说到Forms,我突然想问师兄一个问题,为什么为什么Visual Basic 2005 Beta里窗体类的代码下没有Inherits子句和自动生成的代码了?就剩下这个空壳子……

Public Class Form1

End Class

难道是Beta版的原因?CSDN上有人说2005版就是没有这些代码的,我觉得把这些代码省略了不太好吧?不知师兄是怎么看这个问题的:)
2004-12-24 19:06:00 | [匿名用户:疯牛涕淌]
re: Visual Basic 2005新功能点评(十七)——My命名空间之My.Forms和My.WebServices 编辑
my.forms和VB6一样。。好。
2004-09-11 22:57:00 | [匿名用户:Jockey]
博客主人设置本博客不允许匿名用户发表言论,请登录后再试

Powered by: Joycode MVC Blogger System