首页 > 学院 > 开发设计 > 正文

VisualBasic2005中的My功能

2019-11-18 17:55:08
字体:
来源:转载
供稿:网友
摘要:概述了My功能如何公开.NETFramework功能,包括可用的类、动态生成的类以及线程处理。

注:本文和示例代码均基于MicrosoftVisualStudio2005(此前代号为“Whidbey”)的预发布版。文中包含的所有信息均有可能变更。示例项目需要VisualStudio2005Beta1或更高版本。

简介

My是VisualBasic2005中的一项新功能,它可将常用功能放在您触手可及的地方,并减少了您必须编写的代码行数。它以有效、可靠且线程安全的方式实现这一目的。在程序员工作效率显得尤为重要的环境中,My可以帮助您更快地完成工作,这就是VisualBasic的精髓所在。

本文旨在探究如何使用My来访问.NETFramework功能以及您项目中的项。

可从My中获得的.NETFramework类

由于.NETFramework涉及的内容很多,因此要找到您所需的功能非常困难。为了解决此问题,My提供了常用.NETFramework类和功能的入口点。My还公开了新的高级别.NETFramework类,这些类可将相关的功能汇集到基于任务的API中。

My公开功能的方式包括:返回已实例化并可以使用的.NETFramework类,延推迟对.NETFramework方法的调用,以及返回动态生成的类(使用该类可访问您项目中的项)。

直接公开

只要可能,My便会作为一种发现机制为.NETFramework中的现有类提供服务,并直接公开这些类型。请参见以下My.application.Deployment示例:

PublicReadOnlyPRopertyDeployment()As_
System.Deployment.ApplicationDeployment
Get
Return_
System.Deployment.ApplicationDeployment.CurrentDeployment
EndGet
EndProperty

直接公开的其他示例包括My.Computer.FileSystem.OpenTextFileReader()(它返回System.IO.StreamReader)、My.Application.OpenForms()(它返回System.Windows.Forms.FormsCollection)、My.User(它返回System.Security.Principal.IPrincipal),等等。

外观

My还可以返回能够提供基于任务的API的新类,以用于执行先前难以执行的操作,因为在以前找到功能很困难,并且/或者需要多个对象协同完成。

需要使用低级别.NETFrameworkAPI或者需要多行代码的常见任务得以大大简化。请参见以下确定网络连接是否可用的任务示例:

ImportsSystem.Net.NetworkInformation
PublicReadOnlyPropertyIsAvailable()AsBoolean
Get
ForEachNetInterfaceAsNetworkInterfaceIn_
NetworkInterface.GetAllNetworkInterfaces()
IfNetInterface.Type<>InterfaceType.Loopback_
AndAlsoNetInterface.Type<>InterfaceType.Tunnel_
AndAlsoNetInterface.OperationalStatus=_
OperationalStatus.UpThen
ReturnTrue
EndIf
Next
ReturnFalse
EndGet
EndProperty

上面的代码需要System.Net.NetworkInformation命名空间中几个类型的详细知识。使用外观模式,My.Computer.Network可将这些类型及其关系简化为一行代码:My.Computer.Network.IsAvailable()。

外观还可以将用其他方式难以找到的相关功能简单地汇集在一起。例如,My.Computer可将不同类的属性汇集起来,以提供计算机名以及对屏幕的访问:

PublicReadOnlyPropertyName()AsString
Get
ReturnSystem.Environment.MachineName
EndGet
EndProperty
PublicReadOnlyPropertyScreen()AsSystem.Windows.Forms.Screen
Get
ReturnSystem.Windows.Forms.Screen.PrimaryScreen
EndGet
EndProperty

在My中,可从多个.NETFramework类型中汇集相关功能的类的其他示例包括My.Application、My.Computer、My.Computer.FileSystem、My.Computer.Info以及My.Application.Info。

Proxy类

proxy类是一个非常“瘦”的类,可将对它的所有调用转发到基础对象中。例如,如果您调用My.Computer.Clipboard.GetText(),则实际上是在调用proxy类方法ClipboardProxy.GetText(),定义如下:

PublicFunctionGetText()AsString
ReturnClipboard.GetText()
EndFunction

按照约定,proxy类总是带有后缀Proxy。当访问剪贴板、文件系统以及注册表时,My会利用代理,这是因为代理公开的基本类是由在IntelliSense中不可见的共享方法组成的。Proxy类无法由用户实例化。性能测试已表明,通过代理转发调用毫无意义。

动态生成的类

本着“使功能触手可及”这一宗旨,My提供了对您项目中定义的窗体、Web服务、资源和设置的访问。例如,如果您的项目包含对Web服务MapDirections的引用,则可以立即使用该Web服务,而不必了解如何启动该Web服务代理的实例。您只需键入以下内容:My.WebServices.MapDirections.GetDirections(...)

这是如何工作的?对于您项目中的窗体、Web服务、设置以及资源,factory类是由按需返回以惰性方式创建的实例的编译器生成的。factory类经过调整,可以用适用于项目(您的代码运行在其中)类型(exe/dll/web)的方式返回实例。有关更多详细信息,请参阅“线程处理”部分。

My.Forms

作为动态生成的类的一个示例,请考虑My.Forms。该类已提供给您,并为您项目中的每个窗体定义了工厂(Factory)方法。当您通过My.Forms.Form1访问Form时,该工厂方法会检查是否已打开Form1的一个实例。如果已打开一个实例,便会返回该实例。否则,会创建并返回Form1的一个实例。为包含Form1的项目所生成的代码如下所示:

ClassMyForms
'Codeinboldisgeneratedbythecompiler
Publicm_Form1AsForm1
PublicPropertyForm1()AsForm1
Get
m_Form1=Create__Instance__(OfForm1)(m_Form1)
Returnm_Form1
EndGet
Set(ByValValueAsForm1)
IfValueIsm_Form1
Return
EndIf
IfNotValueIsNothingThen
ThrowNewArgumentException(_
"PropertycanonlybesettoNothing.")
EndIf
Dispose__Instance__(OfForm1)(m_Form1)
EndSet
EndProperty
EndClass

Create__Instance__()函数负责按需创建窗体的实例。它会检查窗体(存储在m_Form1中)是否已被实例化。如果窗体已被实例化,便会返回该窗体。否则,会创建并返回一个实例。Create__Instance__()还会捕获递归窗体创建尝试。Dispose__Instance__()负责关闭该窗体。

My.Forms还提供了重新引入窗体的默认实例的方法,您可能在较早版本的VisualBasic中熟悉该方法。默认实例使得在不必先显式创建窗体的实例的情况下引用窗体的实例成为可能。

例如,在VisualBasic6.0中,作为替代,您可能已经编写了Form1.Show():

DimForm1InstanceasForm1
Form1Instance=newForm1
Form1Instance.Show()

由于VisualBasic2005中的编译器利用My.Forms来创建默认实例,因此,您可以仅编写Form1.Show()。

My.WebServices

人们在针对Web服务进行编码时遇到的困难之一是确定针对哪个类来进行编码。My.WebServices省去了该确定过程并按需提供了Web服务代理的实例。

My.WebServices最适用于同步调用Web服务。所生成的用以提供Web服务代理的实例的代码模式与所示的用以返回窗体的实例的代码模式相同。

My.Settings

VisualBasic2005中的新功能是Settings设计器,它可让您以应用程序或用户为基础指定应用程序设置。该设计器创建了一个类,您可以使用该类以强类型的方式访问您的设置。通过在解决方案资源管理器中显示所有文件并在MySettings.Settings节点下查找MySettings.vb文件,您可以看到MySettings类的一个示例。

以下为所生成的用以管理名为SampleUserSetting的应用程序设置的属性示例:

PartialNotInheritableClassMySettings
InheritsSystem.Configuration.ApplicationSettingsBase
<System.Diagnostics.DebuggerNonUserCode(),_
System.Configuration.UserScopedSettingAttribute(),_
System.Configuration.DefaultSettingValueAttribute("TryMe")>_
PublicPropertySampleUserSetting()AsString
Get
ReturnCType(Me("SampleUserSetting"),String)
EndGet
Set
Me("SampleUserSetting")=value
EndSet
EndProperty
EndClass

生成的类可为您做所有繁重工作。要访问该设置,您只需键入以下内容:

My.Settings.SampleUserSetting

My.Resources

VisualBasic2005中的另一项新功能是Resource设计器,它使您能够向应用程序中添加资源。Resource设计器还会创建一个模块,您可以使用该模块以强类型的方式访问您应用程序中的资源。例如,如果您向项目中添加名为Smiley的位图,则可以使用My.Resources.Smiley访问该位图。通过在示例项目的解决方案资源管理器中显示所有文件并在MyResources.resx节点下查找MyResources.vb文件,您可以看到生成的资源模块的一个示例。

以下为所生成的用以返回Smiley资源的工厂属性的示例项目的一个示例:

PublicReadOnlyPropertySmiley()AsSystem.Drawing.Bitmap
Get
ReturnCType(ResourceManager.GetObject("Smiley",_resCulture),_
System.Drawing.Bitmap)
EndGet
EndProperty

所生成的强类型资源模块处理区分大小写的资源ID,使用System.Resources.ResourceManager类检索您的资源,并管理与获取为应用程序正确创建的ResourceManager相关的详细信息。

要在VisualBasic2002或VisualBasic2003中访问相同的Smiley位图,您首先要将该位图放入.resx文件中,而该操作是很困难的。另一个方法是将它作为嵌入资源放入项目中,并且必须牢记在将要成为嵌入资源的资源的属性网格中更改生成操作。这样,您编写的代码应该如下所示:

DimCurrentAssemblyAsReflection.Assembly=_
Reflection.Assembly.GetExecutingAssembly
DimBitMapStreamAsIO.Stream=_
CurrentAssembly.GetManifestResourceStream(_
"WindowsApplication2.Smiley.bmp")
DimSmileyBitmapasDrawing.Bitmap=NewBitmap(BitMapStream)

该段代码中有一些重要的详细信息是您所必需了解的。您必须知道获取当前正在执行的程序集,并在其上调用GetManifestResourceStream()。您必须牢记使用根命名空间名称来限定资源名。您必须获取大小写权限,这是因为传递给GetManifestResourceStream()的名称是区分大小写的。您必须知道在何处定义流类,这样您可以在流对象中捕获GetManifestResource的返回值。您必须知道如何从流创建位图。由于上述问题之一,在试图判断BitMapStream为什么总是返回Nothing时,您可能会遇到挫折。

VisualBasic2005通过提供ResourceEditor解决第一个问题,使用ResourceEditor可以很容易地将新的或现有资源放入.resx文件中。然后,可以使用My很容易地访问这些资源。您只需编写以下内容:

DimSmileyBitmapasDrawing.Bitmap=My.Resources.Smiley

线程处理

My中可用的类实例是通过缓和线程处理问题的方式公开的,因为My对象的实例是逐线程提供的。即,线程1上返回的My.Computer的实例不同于线程2上返回的My.Computer的实例。这意味着当使用My对象时,您不必编写同步代码。

在Web应用程序中,从My返回的实例是根据请求存储的。

小结

我们已经研究了My如何公开.NETFramework类以及如何生成动态生成的类以补充My。

最后,My可以减少您必须编写的代码行数,并提供对常用功能的访问。它以有效、可靠且线程安全的方式实现这一目的。在程序员工作效率显得尤为重要的环境中,My可以帮助您更加快速有效地完成工作。

->


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表