Visual Basic 2005中的My功能之二(转)

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

Proxy 类

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

Public Function GetText() As String
Return Clipboard.GetText()
End Function

按照约定,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 的项目所生成的代码如下所示:

Class MyForms
'Code in bold is generated by the compiler
Public m_Form1 As Form1
Public Property Form1() As Form1
Get
m_Form1 = Create__Instance__ (Of Form1)(m_Form1)
Return m_Form1
End Get
Set(ByVal Value As Form1)
If Value Is m_Form1
Return
End If
If Not Value Is Nothing Then
Throw New ArgumentException( _
"Property can only be set to Nothing.")
End If
Dispose__Instance__ (Of Form1)(m_Form1)
End Set
End Property
End Class

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

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

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

Dim Form1Instance as Form1
Form1Instance = new Form1
Form1Instance.Show()

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

My.WebServices

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

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

My.Settings

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

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

Partial NotInheritable Class MySettings
Inherits System.Configuration.ApplicationSettingsBase
System.Configuration.UserScopedSettingAttribute(), _
System.Configuration.DefaultSettingValueAttribute("Try Me")> _
Public Property SampleUserSetting() As String
Get
Return CType(Me("SampleUserSetting"),String)
End Get
Set
Me("SampleUserSetting") = value
End Set
End Property
End Class

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

My.Settings.SampleUserSetting

My.Resources

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

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

Public ReadOnly Property Smiley() As System.Drawing.Bitmap
Get
Return CType(ResourceManager.GetObject("Smiley", _resCulture),_
System.Drawing.Bitmap)
End Get
End Property

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

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

Dim CurrentAssembly As Reflection.Assembly = _
Reflection.Assembly.GetExecutingAssembly
Dim BitMapStream As IO.Stream = _
CurrentAssembly.GetManifestResourceStream( _
"WindowsApplication2.Smiley.bmp")
Dim SmileyBitmap as Drawing.Bitmap = New Bitmap(BitMapStream)

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

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

Dim SmileyBitmap as Drawing.Bitmap = My.Resources.Smiley

线程处理

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

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

小结

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

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

[@more@]Visual Basic 2005中的My功能之一(转)

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8781179/viewspace-925154/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/8781179/viewspace-925154/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值