RSS 2.0 Feed
Visual Basic 2005 新功能点评
摘要:尽管在周末发帖子不符合sumtec的Blog守则,但我确实无从选择。每天6点多出家门8点到家10点睡觉的生活,让我找不出空余时间来写Blog。我只能尽量用周末的时间为我贫乏的Blog补充几篇帖子。 今天我继续讨论泛型。上次我们已经了解到.NET泛型在减少装箱和编译时类型检查方面的优点。今天我们继续深入泛型给.NET开发带来的变化。 泛型的类型系统 泛型类型(Generic Type)通过赋予类型参数,在使用时可以表现为多种构造类型(Constructed Type)。如TheClass(Of T)在使用时可以是TheClass(Of Int32),也可以是TheClass(Of String)他们都是不同的类型。这些类型之间没有任何继承关系,也没有互相包容的功能。TheClass(Of Object)并不是其他TheClass(Of T)构造类型的基类,也没有一种写法可以表示类型参数为任意类型的情况。这种类型衍生往往会连带泛型类内嵌类型一起衍生。比如在TheClass(Of T)中内嵌定义有枚举(或结构、委托、类等)TypeA,则TheClass(Of Int32).TypeA和TheClass(Of String).TypeA也非相同类型。在.Net Framwork的类库中,这种情形频繁出现,如List(Of T).Enumerator。因此,注意让你的内嵌类性与泛型的类型参数有关,否则就应该将内嵌类型定义到泛型类型的外部,以免发生类型衍生。一般不要在泛型类型中内嵌定义另一个泛型类型,如ClassA(Of T1).ClassB(Of T2),他在衍生类型的时候就更复杂了,因为两个类型参数都可以赋予不同的类型,会产生大量你也不知道有什么用的构造类型。 .NET Framework还增强了反射的功能以便在运行时研究泛型类型及其所有构造类型。每个构造类型都有确定的类型,可以通过obj.GetType()获取运行时类型的Type对象,还可以用GetType运算符获取泛型类型本身或其任何构造类型的Type对象。现在Type类有HasGenericParameters属性以指示此类型是否源自泛型类型,以及HasUnboundGenericParameters属性以指示此泛型类型的所有类型参数是否已经确定等。你还可以通过Type对象的相关方法检测泛型类型每个类型参数的详细状况。 约束 约束(Constraint)这一功能的本意是缩小类型参数所能取值的范围。比如你希望你的类ClassA(Of T)中类型参数T只能接受Exception或其子类等要求,可以通过约束这一功能达成。约束会带来一种“副作用”,事实上更多人把这个副作用当成约束的主要功能来用,我们下边详细叙述。约束的语法是: Definition(Of TypeParam As Constraints) 比如我们要给ClassA定义类型参数T,并约束T只能为Exception或其子类的定义为: Class ClassA(Of T As Exception) 如果我们要写ClassA(Of Integer)就会产生编译错误,因为T已经不能去Int32作类型参数了。T的取值范围已经缩小,除此之外约束还有什么功能呢。我们可以在ClassA中定义一个方法: Public Sub ThrowIt(ByVal ex As T)    Throw exEnd Sub 我们写了Throw ex,为什么可以这样写?可以试试将类型定义中的“As Exception”去除,这里立即就会有编译错误。这是因为.NET默认情况下不允许对类型参数的对象施以任何操作,除了能对Object类型进行的操作以外。就是说默认情况下T类型的对象没有除Object类型所具有的方法/属性以外的任何成员,也不能使用任何运算符。这通常是一个很大的限制。但当你使用约束时,类型参数就会自动具有继承自约束类型的所有功能。比如继承自Exception就可以用于Throw语句,而约束了Exception的类型参数T的对象同样可以用于Throw语句。我们常常这样写: Class ClassB(Of T As IDisposable) 这样T的取值范围就被限定在实现了IDisposable的所有类型中,而副作用是T型对象具有IDisposable接口的成员:Dispose()方法。比如书写这样的过程。 Public Sub DisposeIt(ByVal obj As T)    obj.Dispose()End Sub 我要强调约束的主要功能是减少类型参数的取值范围,而不是给类型参数增加可操作的功能(那只是副作用)。一般不要为了这种目的给类型参数加约束。比如你想让操作对象有Dispose方法,不妨用这种写法代替约束: Public Sub DisposeIt(ByVal obj As IDisposable)    obj.Dispose()End Sub 只有当你的类型参数一定要有某种功能,否则整个泛型类都无法工作的时候,才使用约束。不然你会发现约束了很多类型后,你的泛型类型的用途大大减少了。 还有一种特殊的约束——构造器约束。他约束你的类型参数只能取那些有一个不带参数的公有构造器的类型。其副作用是,你可以在这个泛型类中创建类型参数的实例: Public Class ClassB(Of T As New)    Public Sub MySub()        Dim o As T        o = New T()    End SubEnd Class 注意构造器的写法:用New关键字作约束类型。构造器约束看起来很有用。 如果你要约束两个以上的类型,你可以把要约束的类型放在花括号里{},就像数组一样。比如你的类型参数同时需要约束构造器和IDisposable,就这样写: Public Class ClassC(Of T As {IDisposable, New}) 你还可以用多约束做一些以前只用接口做不到的事情,比如这样: Sub MyMethod(Of T As {IDisposable, ICloneable})(ByVal obj As T) 这个定义实现了让参数obj的类型只能为同时实现了两个接口的类型,不用泛型你以前可以做到吗? 下期介绍: 泛型API...[阅读全文]

posted @ | Feedback (8) | Filed Under [ 技术随笔 Visual Basic 2005 新功能点评 ]

摘要:这个系列总算走到了Visual Basic最后一个大的语言改进——泛型。事实上,泛型是.NET Framework 2.0所支持的一项特别的功能,Visual Basic 2005只不过从语言层面上支持他,就像C#和C++/CLI一样。首先,我们从泛型本身介绍起。 需求 我们常常会有一种需求,就是我们编写的代码能够针对多种类型执行。比如排序,检索,集合的操作等等。这些操作的代码应该能够只编写一次,就能够广泛地用于所有类型。.NET Framework 1.1或更早版本提供的方案是,用继承树的根——Object,承载任何类型。这样针对Object的算法就等于兼容于所有的类型。但是以Object作为所有类型的承载容器有两个重要的问题:首先值类型在转换成Object时要进行“装箱”操作,该操作的速度非常缓慢,因此性能就成最大的问题。其次是对Object进行操作必须通过运行时类型转换才能进行,这样就不能在编译期间发现类型不兼容的操作。比如我们有一个自定义的结构——Customer,我们希望用ArrayList来保存一个Customer的列表: Dim customerList As New ArrayList()customerList.Add(New Customer("Harry Potter", 13, "Hogwarts School"))'当我们要使用这条记录时MsgBox(CType(customerList(0), Customer).Name) 初看起来这没有任何问题,但是如果我们添加的语句写成这样: customerList.Add("Hello") 会怎么样呢?String根本不能转换成Customer类型,但是没有任何提示阻止你这样做。这个错误直到运行时才会体现出来。我们需要强类型的方法,编译时的类型检查和更高的性能,所以我们需要泛型。 感受泛型 现在我们就来看看针对上述需求的泛型解决方案。.NET Framework 2.0支持一种新的泛型列表——List(Of T)。这里我们引入了Of语句,他就是Visual Basic为实现泛型而增加的。其中T称为“类型参数”,它接受任意一个.NET类型作为元素的类型。于是我们可以将上述Customer的代码写成: Dim customerList As New List(Of Customer)customerList.Add(New Customer("Harry Potter", 13, "Hogwarts School"))MsgBox(customerList(0).Name) 我们来看看这段代码中改变的地方。首先List(Of Customer)对T进行了指定,所以现在customerList对象就是一个只能装Customer类型元素的列表。这件事是在编译期间决定的,因此编译期始终知道customerList元素的类型,所以在取出其中对象时无需再进行任何类型装换。更重要的是,现在再向customerList中放入不是Customer类型的变量就会出现编译错误,而不是原来的运行时错误了。泛型能让编译期明确正在操作的类型,它就不会对值类型进行装箱操作,于是性能也大大提高了。使用泛型的另外一个好处是,Visual Basic的IDE能够为你提供智能感知,当你使用customerList.Add时,含有正确信息的提示出现了: 开始编写泛型的代码 泛型提供给你的不仅仅是使用.NET Framework中已经设计好的泛型类型,你完全可以自己书写泛型的代码。仍然是使用Of语句: Class MyGeneric(Of T) 这时,Of语句的作用不再是为类型参数提供所需的类型,而是定义新的类型参数。现在MyGeneric就接受一个名为T的类型参数。在MyGeneric泛型类的内部T被看作一个类型。你应当将T想象成使用该泛型类时能在Of语句之后提供的任何类型。现在只要对T进行编码就行了,比如: Class MyGeneric(Of T)    Private myVar As T    Public Sub SetVar(ByVal newValue As T)        myVar = newValue    End Sub    Public Function GetVar() As T        Return myVar    End FunctionEnd Class 相当简单吧。当你要使用这个泛型类的时候,如同Framework提供的泛型类一样,要指定类型参数T的真实类型。如这一语句: Dim obj As New MyGeneric(Of Integer) 这时obj的类型实际上就是一个将上述定义中所有T都换成Integer的类型。而 Dim obj As New MyGeneric(Of String) 这条语句中,obj则是一个T为String型的实例。你可以任意指定类型参数,以便创建出更多适于不同类型的对象,这就是泛型的精髓——“书写一次,使用于广泛的类型”。 泛型不仅仅能用于类型的定义,你还能够定义泛型的方法。其语法和泛型类型基本一样: Public Function IIf(Of T)(Expression As Boolean, TruePart As T, _    FalsePart As T) As T 这就是一个泛型方法,其参数和返回类型都可以使用类型参数T所表示的类型。泛型方法可以像泛型类型那样,使用Of语句来确定类型参数T: max = IIf(Of Integer)(a > b, a, b) 通过指定类型参数为Integer,我们的IIf(Of T)函数就成了专门针对Integer的IIf函数。其实,Visual Basic还支持类型参数的隐式指定,就是说当参数或返回值能够有足够的信息确定类型参数时,Of语句就不必写了。比如 Dim max, a, b......[阅读全文]

posted @ | Feedback (8) | Filed Under [ 技术随笔 Visual Basic 2005 新功能点评 ]

摘要:在Visual Studio中进行开发时,我们已经很习惯代码窗口右边放置解决方案资源管理器和属性窗口的布局。但是写代码时那个属性窗口能做什么用呢?Visual Basic 2005的开发人员决定利用这个空间,于是就创造出了Attribute编辑器。说到Attribute我们都不陌生,他是给代码添加自定义元数据的一种方式,有些Attribute能够被.NET Framework或编译器识别利用。比如常用的有Serializable、COMVisible等。传统方法添加Attribute都是通过书写代码,这样Attribute及其属性越写越多,修改就会很麻烦。而采用了Attribute编辑器,就能用鼠标作这件事了。首先我们切换到代码窗口,可以看出右下的属性窗口已经变成Attribute编辑器了。如图: 如果要添加SerializableAttribute,只要双击那个位置即可。除了这些默认的常用Attribute,这个编辑器还可以可视化地设计其他一些Attribute。在设计控件时我们经常要编写一大堆ComponentModel里面的Attribute,正好可以用Attribute编辑器来简化这个操作。 不过目前Attribute编辑器能够编辑的Attribute还很少,也不能用于自定义的Attribute。我相信在正式版本中这个功能会有更好的表现。 本期就介绍这个小小的功能,下期介绍可视化调试器...[阅读全文]

posted @ | Feedback (4) | Filed Under [ 技术随笔 Visual Basic 2005 新功能点评 ]

摘要:我已经将My命名空间中所有默认的对象都介绍完了,相信大家已经开始体验到My的方便之处。但是对于一些高级用户来说,这些功能还显得有所欠缺。老手们有时也编写了类似My功能的类或函数,要是能把他们放到My命名空间中多好。My就像一个可随时访问的工具箱,除了里面已经有的工具以外,当然允许我们将自己的东西放进去。下面我们就来看看怎么扩展My命名空间。 添加自定义的类或模块 如果我们想要放进My中的函数都是静态的,那么直接把类或模块放入My命名空间是个方便的方法,做法非常简单,只要将类或模块定义在My命名空间中即可 Namespace My    Public Module Tools        Public Sub DoSomething()            'Some code here        End Sub    End ModuleEnd Namespace 现在就可以直接用My.Tools来访问自定义的模块,很方便。 添加自定义类的实例 如果我们观察Visual Basic所提供的My命名空间成员,将发现他们都不是类本身,而是对象。因为所有的方法都做成静态毕竟不是最佳方法,我们有时候需要将一些自定义类的实例放到My命名空间中,这样不用的时候就比较节省内存,而且易于控制资源释放的问题。首先我们要定义自定义类,可以放在任何地方,而不必放到My命名空间中,这样就可以避免类名直接显示在My关键字后。然后,在My命名空间下,定义一个带有HideModuleNameAttribute的模块,名称可以随便起;最后在模块中设定访问自定义类实例的属性。假设我们的自定义类叫ToolsProxy,而自定义属性叫Tools,那么可以这样写: 'Namespace My<HideModuleName()> _Friend Module MyCustomModule    Private syncRoot As New Object    Private _tools As ToolsProxy    ''' <summary>    ''' Contains my custom tools.    ''' </summary>    Public ReadOnly Property Tools() As ToolsProxy        Get            'Double check lock to ensure thread safty.            If _tools Is Nothing Then                SyncLock syncRoot                    If _tools Is Nothing Then                        _tools = New ToolsProxy                    End If                End SyncLock            End If            Return _tools        End Get    End PropertyEnd Module 有了HideModuleName这个Attribute,它本身就不会出现在My关键字后面,而它的属性则会显示。完成以后,你会发现My.Tools这次与Visual Basic内置在My中的对象没有任何区别了。此方法为扩展My最佳的方法,推荐使用。 扩展My.Application或My.Computer 有时候,我们不仅要将自定义的类添加到My中,还希望更进一步直接补充My.Application或My.Computer本身的功能。而这完全可以做到。Visual Basic提供了Partial关键字,他可以扩写当前项目中的类或结构,无论原先定义的时候是否加上了Partial关键字。于是我们就可以利用这一特征扩写定义看不见的My.Application或My.Computer。My.Application对应的是MyApplication类,而My.Computer对应的是MyComputer类。比如我们要给My.Computer增加一个新的功能——CdRomDriver属性,用以控制光驱的弹出、缩进与自动运行,就可以直接在My命名空间下扩写MyComputer类,如下: 'Namespace My Partial Class MyComputer    Public ReadOnly Property CdRomDriver() As CdRomDriver        Get            'Codes here        End Get    End PropertyEnd......[阅读全文]

posted @ | Feedback (6) | Filed Under [ 技术随笔 Visual Basic 2005 新功能点评 ]

摘要:如果说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命名空间的功能。...[阅读全文]

posted @ | Feedback (9) | Filed Under [ 技术随笔 Visual Basic 2005 新功能点评 ]

摘要:从原理上来说,My.Resources与前面介绍的My.Computer或My.Application是完全不同的,他带来的是另一种方便。My.Resource不是一个类库,而是My命名空间中唯一一个子命名空间。他的功能是什么呢?我们先回忆一下在.NET Framework1.1时代使用资源的情形。首先我们得通过工具,将图片、文本或声音等资源添加到资源列表中,编译成资源文件,再嵌入到我们的程序集中。当我们要使用资源的时候,必须通过System.Resources.ResourceManager从程序集中提取资源,然后自行判断资源的类型,做适当的转化并使用。比如从Form1的资源中取出ID为Greeting的字符串,需要写这么多代码: Dim manager As New System.Resources.ResourceManage( _    "MyApp.Form1", Me.GetType().Assembly)Dim s As String = manager.GetString("Greeting") 而且那个编辑resx的界面不太直观,只添加字符串资源就不太方便,要想添加图片、音乐等文件到资源文件并在程序中取用就更麻烦了。到现在,许多Visual Basic .NET程序员还总是询问将图片音乐嵌入到EXE文件中去的方法。.NET Framework 2.0为解决这个问题引入了一个新特性——强类型资源。首先ResourceManager增加了一个GetStream()方法,方便获取图片、声音类的资源,其次Resgen工具可以根据资源的内容生成一个包装类,通过它可以直接强类型地读些程序集内的资源。而Visual Basic 2005将强类型资源与VB的IDE的特性结合在一起,就成了方便无比的My.Resources。 在实际使用My.Resources之前,我们先看看Visual Basic 2005新的资源编辑器,它现在已经继承到了项目属性中。打开项目属性并切换到Resources选项卡,我们可以看到如下的资源编辑器。 从顶端的下拉列表框中,可以选择资源的类型——声音、图像、文本、文件、图标或其他自定义内容。选择相应的类别,下面的编辑器就会发生变化,以适应当前类型的资源。每种类别都可以添加任意数量的资源。比如我们添加一个名称为Greeting的字符串,并让它的值等于"Hello",然后切换到代码窗口,输入My.Resource.看到什么了?Greeting弹出来了。现在我们使用这个资源之需要一行代码了。对比刚才所述的旧方法,你感到方便之处了吗? Dim s As String = My.Resources.Greeting 如果我们添加了图片资源,那么也可以直接使用My.Resources来访问,而且就是BitMap类型,你想怎样用它就可以怎样用它,比如: BackgroundImage = My.Resources.MyPic 一行代码就可以轻轻松松将窗口背景设置为资源中的图片。如果储存了声音资源,那么结合My.Computer.Audio的功能,播放资源中的声音也变得如此简单: My.Computer.Audio.PlaySound(My.Resources.MySound) 想象一下以前要多少代码才能完成这样一个任务!有了My.Resource,资源的使用变得非常简单,你一定会改变对使用资源的看法,而爱上在自己的程序中使用资源的。 My.User是My命名空间中最小的成员,但是别看他小,功能对于.NET新手来说却不简单。如果你初次接触.NET开发,要获取当前登陆用户的用户名和用户组怎么办呢?谁会想到它其实是和Thread.CurrentPrincipal属性有关呢?My.User简单地将用户名和角色信息提供给你,要想获得当前登录的用户名,只需要输入My.User.Identity就行了。 下期预告 My命名空间的最后两个功能——My.Forms和My.WebServices...[阅读全文]

posted @ | Feedback (8) | Filed Under [ 技术随笔 Visual Basic 2005 新功能点评 ]

摘要:My.Computer可能是My命名空间中最有趣的部分了,这一部分封装了大量访问系统和硬件信息的功能,操作起来比直接使用.NET Framework或Windows API都方便得多。My.Computer中有很多对象,下面我们分别来介绍。 My.Computer.Audio Audio对象提供了播放音频的功能,它既可以从wav等文件播放,也可以从音频数据流来播放,就是说你可以用它轻松播放储存在资源文件中或者数据库中的音频。播放时还可以指定后台播放或等待结束等多种设置。结合My.Resources来使用,更显得方便无穷。这是一个简单的播放wav文件的例子: My.Computer.Audio.Play("c:\ding.wav", AudioPlayMode.BackgroundLoop) My.Computer.Clipboard Clipboard对象提供了以强类型方式读写剪贴板的功能,比Windows.Forms里面的剪贴板更加好用。使用Clipboard对象可以直接从剪贴板读写音频、图像、文本甚至我的电脑中的文件拖放信息。此外,由VB6升级的项目现在将直接使用My.Computer.Clipboard对象升级以前的Clipboard对象,这将解决VB.NET不能升级原先剪贴板功能的缺陷。下面的例子将文本框内的内容复制到剪贴板: My.Computer.Clipboard.SetText(TextBox1.Text) My.Computer.Clock Clock对象是一个获取时间的工具,它可以直接获取当地时间、中时区的时间和从当时子时开始的毫秒计数。 My.Computer.FileSystem 这是微软Visual Basic Team在My.Computer中倾注最多精力的对象,使用它可以充分改善文件操作的复杂程度。FileSystem对象提供了易于理解的操作方式。FileSystem对象中复制文件的方法不但只需要指定目标路径,还可以帮助你建立目标目录中不存在的级别。它还特别提供了CopyDirectory的功能,可以复制整个目录!这正是目前.NET Framework缺乏的功能。同时FileSystem还能提供搜索上级目、子目录或根目录的功能,非常体贴。下面例子展示了如何在动画演示下将文件放入回收站。 My.Computer.FileSystem.DeleteFile("c:\mybigfile.big", True, True) FileSystem对象还提供了只用一行代码就可以读取文本文件内容,或者将所需内容写入文本文件的功能,现在你不需要再用迷惑人的StreamReader、StreamWriter来读写文件了,还不用担心资源释放的问题。如下面的例子: s = My.Computer.FileSystem.ReadAllText("c:\a.txt") 除了可以通过My访问以外,通过System.IO.FileSystem类也可以完成FileSystem对象的大多数功能,这种方式似乎更适合于使用C#或C++的开发者。 My.Computer.Info 看名字就知道了,这个对象的属性都是系统信息。如果你想获得本机物理内存或虚拟内存的总数,剩余量、操作系统名称、当前用户名、本机安装的文化设置等等,都可以轻松使用Info对象,它让你对应用程序所在的系统了如指掌。 My.Computer.Keyboard和My.Computer.Mouse 通过这两个对象,你可以快速获得用户键盘的信息,如大写锁定、数字键盘锁定等是否打开,以及鼠标有几个按键,是否配备滚轮等。如果你希望你的应用程序能够做到最体贴用户,那这些信息是少不了了。下面例子演示获取用户的鼠标左右键功能是否交换(这样你就可以知道用户是不是左撇子,从而提供更体贴的界面,多爽) Dim f As Boolean = My.Computer.Mouse.ButtonsSwapped My.Computer.Name 不用多说,这就是本机操作系统安装时输入的名称 My.Computer.Network 这个Network对象充分简化了最常用的网络任务,只需要一行代码,就可以Ping一个地址,或者检测网络是否接通。还能用一行代码下载或上传文件。比如这个例子就完成了一个下载文件的任务: If My.Computer.Network.IsAvailable Then    My.Computer.Network.DownloadFile("http://abc.com/x.zip", _        "C:\download")End IfMy.Computer.Port 提供了用一行代码打开本机串口的功能,还能立刻绑定一个事件监视串口的变化。现在串口编程出奇的简单,再也不需要MSComm控件了。 My.Computer.Printers 这个Printers对象能够遍历本机所安装的所有打印机,还能找出默认的打印机。通过向默认打印机画图一样的操作,就能开始打印了。这样的操作会让你想起VB6时代便利而简洁的打印操作。下面的例子将在默认打印机上打印一个椭圆。从VB6升级项目时,原来的Printer对象将自动升级为My.Computer.Printers中的相关操作,升级的用户可以更加放心了。 My.Computer.Printers.DefaultPrinter.DrawEllipse( _    New RectangleF(2, 2, 50, 150), 1)My.Computer.Printers.DefaultPrinter.Print() My.Computer.Registry 这个注册表对象可比Microsoft.Win32空间中的那个版本简单多了,他提供强类型的路径支持,还能非常方便地读写注册表。下面的例子是一段内置的代码片断,演示了如何判断某一键值是否存在。 Dim exists As Boolean = True Dim path As String = "Software\Microsoft\TestApp\1.0" If My.Computer.Registry.CurrentUser.OpenSubKey(path) Is Nothing Then    exists = FalseEnd If My.Computer.Screen Screen对象可以获取屏幕的可视范围,像素的位数等。比VB6的Screen对象更强的是,它现在支持两个显示器。 现在我们已经了解了My.Computer中的所有对象,这些对象将大部分任务简化成一行代码,对你的日常编程是不是非常有帮助呢? 下期预告 下期我们介绍Visual Basic中的强类型资源——My.Resources...[阅读全文]

posted @ | Feedback (22) | Filed Under [ 技术随笔 Visual Basic 2005 新功能点评 ]

摘要:关键字:VB8.0 VB.NET VB2005 My namespace Visual Basic不同于Visual C#、Visual C++之处在于它更偏重于快速开发,更针对非专业开发人员和编程新手。Visual Basic 2005这次提供的“My”是一个极为出色的设计,可以帮助开发人员快速利用.NET Framework中的各种功能进行开发。说到My到底是什么,其实它就是一个工程相关的命名空间,其中的内容是由IDE帮助你组织的。 在My出现以前,.NET Framework已经具有强大而丰富的类库,学习这些类库算不上是一件轻松的事。许多VB或VC的开发者第一次接触到.NET开发时,总是习惯于自己实现或通过调用Windows API实现某些.NET早已准备好的功能。其原因就是.NET类库太庞大太分散了,许多常用的功能与那些不太常用的功能混在一起。比如,获得从当日零点开始的毫秒数的方法(经常被用来做随机数的种子)竟然与设置环境变量功能同在Environment类中,而不是“看上去像是”的System.Timers、TimeSpan或DateTime等命名空间或类型中。许多开发者对类库不熟悉,于是就一遍又一遍地重复开发.NET Framework的功能。Visual Basic Team为了解决这个问题,设计了My命名空间,它将.NET Framework中最常用的功能挑出来,然后按照最容易理解的逻辑结构存放在一起。当你深入My命名空间,你会发现那些功能就在你凭直觉就能想象到的路径中。 My命名空间在当前版本中主要包含My.Application、My.Computer、My.Resources、My.User、My.Forms和My.Webservices等六个主要部分。你可以输入My关键字找到他们,也可以导入My命名空间