注:本文和示例代碼均基于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可以幫助您更加快速有效地完成工作。
->新聞熱點
疑難解答