注:本文和示例代碼均基于MicrosoftVisualStudio2005(此前代號(hào)為“Whidbey”)的預(yù)發(fā)布版。文中包含的所有信息均有可能變更。示例項(xiàng)目需要VisualStudio2005Beta1或更高版本。
簡(jiǎn)介
My是VisualBasic2005中的一項(xiàng)新功能,它可將常用功能放在您觸手可及的地方,并減少了您必須編寫(xiě)的代碼行數(shù)。它以有效、可靠且線程安全的方式實(shí)現(xiàn)這一目的。在程序員工作效率顯得尤為重要的環(huán)境中,My可以幫助您更快地完成工作,這就是VisualBasic的精髓所在。
本文旨在探究如何使用My來(lái)訪問(wèn).NETFramework功能以及您項(xiàng)目中的項(xiàng)。
可從My中獲得的.NETFramework類(lèi)
由于.NETFramework涉及的內(nèi)容很多,因此要找到您所需的功能非常困難。為了解決此問(wèn)題,My提供了常用.NETFramework類(lèi)和功能的入口點(diǎn)。My還公開(kāi)了新的高級(jí)別.NETFramework類(lèi),這些類(lèi)可將相關(guān)的功能匯集到基于任務(wù)的API中。
My公開(kāi)功能的方式包括:返回已實(shí)例化并可以使用的.NETFramework類(lèi),延推遲對(duì).NETFramework方法的調(diào)用,以及返回動(dòng)態(tài)生成的類(lèi)(使用該類(lèi)可訪問(wèn)您項(xiàng)目中的項(xiàng))。
直接公開(kāi)
只要可能,My便會(huì)作為一種發(fā)現(xiàn)機(jī)制為.NETFramework中的現(xiàn)有類(lèi)提供服務(wù),并直接公開(kāi)這些類(lèi)型。請(qǐng)參見(jiàn)以下My.application.Deployment示例:
PublicReadOnlyPRopertyDeployment()As_
System.Deployment.ApplicationDeployment
Get
Return_
System.Deployment.ApplicationDeployment.CurrentDeployment
EndGet
EndProperty
直接公開(kāi)的其他示例包括My.Computer.FileSystem.OpenTextFileReader()(它返回System.IO.StreamReader)、My.Application.OpenForms()(它返回System.Windows.Forms.FormsCollection)、My.User(它返回System.Security.Principal.IPrincipal),等等。
外觀
My還可以返回能夠提供基于任務(wù)的API的新類(lèi),以用于執(zhí)行先前難以執(zhí)行的操作,因?yàn)樵谝郧罢业焦δ芎芾щy,并且/或者需要多個(gè)對(duì)象協(xié)同完成。
需要使用低級(jí)別.NETFrameworkAPI或者需要多行代碼的常見(jiàn)任務(wù)得以大大簡(jiǎn)化。請(qǐng)參見(jiàn)以下確定網(wǎng)絡(luò)連接是否可用的任務(wù)示例:
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命名空間中幾個(gè)類(lèi)型的詳細(xì)知識(shí)。使用外觀模式,My.Computer.Network可將這些類(lèi)型及其關(guān)系簡(jiǎn)化為一行代碼:My.Computer.Network.IsAvailable()。
外觀還可以將用其他方式難以找到的相關(guān)功能簡(jiǎn)單地匯集在一起。例如,My.Computer可將不同類(lèi)的屬性匯集起來(lái),以提供計(jì)算機(jī)名以及對(duì)屏幕的訪問(wèn):
PublicReadOnlyPropertyName()AsString
Get
ReturnSystem.Environment.MachineName
EndGet
EndProperty
PublicReadOnlyPropertyScreen()AsSystem.Windows.Forms.Screen
Get
ReturnSystem.Windows.Forms.Screen.PrimaryScreen
EndGet
EndProperty
在My中,可從多個(gè).NETFramework類(lèi)型中匯集相關(guān)功能的類(lèi)的其他示例包括My.Application、My.Computer、My.Computer.FileSystem、My.Computer.Info以及My.Application.Info。
Proxy類(lèi)
proxy類(lèi)是一個(gè)非常“瘦”的類(lèi),可將對(duì)它的所有調(diào)用轉(zhuǎn)發(fā)到基礎(chǔ)對(duì)象中。例如,如果您調(diào)用My.Computer.Clipboard.GetText(),則實(shí)際上是在調(diào)用proxy類(lèi)方法ClipboardProxy.GetText(),定義如下:
PublicFunctionGetText()AsString
ReturnClipboard.GetText()
EndFunction
按照約定,proxy類(lèi)總是帶有后綴Proxy。當(dāng)訪問(wèn)剪貼板、文件系統(tǒng)以及注冊(cè)表時(shí),My會(huì)利用代理,這是因?yàn)榇砉_(kāi)的基本類(lèi)是由在IntelliSense中不可見(jiàn)的共享方法組成的。Proxy類(lèi)無(wú)法由用戶(hù)實(shí)例化。性能測(cè)試已表明,通過(guò)代理轉(zhuǎn)發(fā)調(diào)用毫無(wú)意義。
動(dòng)態(tài)生成的類(lèi)
本著“使功能觸手可及”這一宗旨,My提供了對(duì)您項(xiàng)目中定義的窗體、Web服務(wù)、資源和設(shè)置的訪問(wèn)。例如,如果您的項(xiàng)目包含對(duì)Web服務(wù)MapDirections的引用,則可以立即使用該Web服務(wù),而不必了解如何啟動(dòng)該Web服務(wù)代理的實(shí)例。您只需鍵入以下內(nèi)容:My.WebServices.MapDirections.GetDirections(...)
這是如何工作的?對(duì)于您項(xiàng)目中的窗體、Web服務(wù)、設(shè)置以及資源,factory類(lèi)是由按需返回以惰性方式創(chuàng)建的實(shí)例的編譯器生成的。factory類(lèi)經(jīng)過(guò)調(diào)整,可以用適用于項(xiàng)目(您的代碼運(yùn)行在其中)類(lèi)型(exe/dll/web)的方式返回實(shí)例。有關(guān)更多詳細(xì)信息,請(qǐng)參閱“線程處理”部分。
My.Forms
作為動(dòng)態(tài)生成的類(lèi)的一個(gè)示例,請(qǐng)考慮My.Forms。該類(lèi)已提供給您,并為您項(xiàng)目中的每個(gè)窗體定義了工廠(Factory)方法。當(dāng)您通過(guò)My.Forms.Form1訪問(wèn)Form時(shí),該工廠方法會(huì)檢查是否已打開(kāi)Form1的一個(gè)實(shí)例。如果已打開(kāi)一個(gè)實(shí)例,便會(huì)返回該實(shí)例。否則,會(huì)創(chuàng)建并返回Form1的一個(gè)實(shí)例。為包含F(xiàn)orm1的項(xiàng)目所生成的代碼如下所示:
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__()函數(shù)負(fù)責(zé)按需創(chuàng)建窗體的實(shí)例。它會(huì)檢查窗體(存儲(chǔ)在m_Form1中)是否已被實(shí)例化。如果窗體已被實(shí)例化,便會(huì)返回該窗體。否則,會(huì)創(chuàng)建并返回一個(gè)實(shí)例。Create__Instance__()還會(huì)捕獲遞歸窗體創(chuàng)建嘗試。Dispose__Instance__()負(fù)責(zé)關(guān)閉該窗體。
My.Forms還提供了重新引入窗體的默認(rèn)實(shí)例的方法,您可能在較早版本的VisualBasic中熟悉該方法。默認(rèn)實(shí)例使得在不必先顯式創(chuàng)建窗體的實(shí)例的情況下引用窗體的實(shí)例成為可能。
例如,在VisualBasic6.0中,作為替代,您可能已經(jīng)編寫(xiě)了Form1.Show():
DimForm1InstanceasForm1
Form1Instance=newForm1
Form1Instance.Show()
由于VisualBasic2005中的編譯器利用My.Forms來(lái)創(chuàng)建默認(rèn)實(shí)例,因此,您可以?xún)H編寫(xiě)Form1.Show()。
My.WebServices
人們?cè)卺槍?duì)Web服務(wù)進(jìn)行編碼時(shí)遇到的困難之一是確定針對(duì)哪個(gè)類(lèi)來(lái)進(jìn)行編碼。My.WebServices省去了該確定過(guò)程并按需提供了Web服務(wù)代理的實(shí)例。
My.WebServices最適用于同步調(diào)用Web服務(wù)。所生成的用以提供Web服務(wù)代理的實(shí)例的代碼模式與所示的用以返回窗體的實(shí)例的代碼模式相同。
My.Settings
VisualBasic2005中的新功能是Settings設(shè)計(jì)器,它可讓您以應(yīng)用程序或用戶(hù)為基礎(chǔ)指定應(yīng)用程序設(shè)置。該設(shè)計(jì)器創(chuàng)建了一個(gè)類(lèi),您可以使用該類(lèi)以強(qiáng)類(lèi)型的方式訪問(wèn)您的設(shè)置。通過(guò)在解決方案資源管理器中顯示所有文件并在MySettings.Settings節(jié)點(diǎn)下查找MySettings.vb文件,您可以看到MySettings類(lèi)的一個(gè)示例。
以下為所生成的用以管理名為SampleUserSetting的應(yīng)用程序設(shè)置的屬性示例:
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
生成的類(lèi)可為您做所有繁重工作。要訪問(wèn)該設(shè)置,您只需鍵入以下內(nèi)容:
My.Settings.SampleUserSetting
My.Resources
VisualBasic2005中的另一項(xiàng)新功能是Resource設(shè)計(jì)器,它使您能夠向應(yīng)用程序中添加資源。Resource設(shè)計(jì)器還會(huì)創(chuàng)建一個(gè)模塊,您可以使用該模塊以強(qiáng)類(lèi)型的方式訪問(wèn)您應(yīng)用程序中的資源。例如,如果您向項(xiàng)目中添加名為Smiley的位圖,則可以使用My.Resources.Smiley訪問(wèn)該位圖。通過(guò)在示例項(xiàng)目的解決方案資源管理器中顯示所有文件并在MyResources.resx節(jié)點(diǎn)下查找MyResources.vb文件,您可以看到生成的資源模塊的一個(gè)示例。
以下為所生成的用以返回Smiley資源的工廠屬性的示例項(xiàng)目的一個(gè)示例:
PublicReadOnlyPropertySmiley()AsSystem.Drawing.Bitmap
Get
ReturnCType(ResourceManager.GetObject("Smiley",_resCulture),_
System.Drawing.Bitmap)
EndGet
EndProperty
所生成的強(qiáng)類(lèi)型資源模塊處理區(qū)分大小寫(xiě)的資源ID,使用System.Resources.ResourceManager類(lèi)檢索您的資源,并管理與獲取為應(yīng)用程序正確創(chuàng)建的ResourceManager相關(guān)的詳細(xì)信息。
要在VisualBasic2002或VisualBasic2003中訪問(wèn)相同的Smiley位圖,您首先要將該位圖放入.resx文件中,而該操作是很困難的。另一個(gè)方法是將它作為嵌入資源放入項(xiàng)目中,并且必須牢記在將要成為嵌入資源的資源的屬性網(wǎng)格中更改生成操作。這樣,您編寫(xiě)的代碼應(yīng)該如下所示:
DimCurrentAssemblyAsReflection.Assembly=_
Reflection.Assembly.GetExecutingAssembly
DimBitMapStreamAsIO.Stream=_
CurrentAssembly.GetManifestResourceStream(_
"WindowsApplication2.Smiley.bmp")
DimSmileyBitmapasDrawing.Bitmap=NewBitmap(BitMapStream)
該段代碼中有一些重要的詳細(xì)信息是您所必需了解的。您必須知道獲取當(dāng)前正在執(zhí)行的程序集,并在其上調(diào)用GetManifestResourceStream()。您必須牢記使用根命名空間名稱(chēng)來(lái)限定資源名。您必須獲取大小寫(xiě)權(quán)限,這是因?yàn)閭鬟f給GetManifestResourceStream()的名稱(chēng)是區(qū)分大小寫(xiě)的。您必須知道在何處定義流類(lèi),這樣您可以在流對(duì)象中捕獲GetManifestResource的返回值。您必須知道如何從流創(chuàng)建位圖。由于上述問(wèn)題之一,在試圖判斷BitMapStream為什么總是返回Nothing時(shí),您可能會(huì)遇到挫折。
VisualBasic2005通過(guò)提供ResourceEditor解決第一個(gè)問(wèn)題,使用ResourceEditor可以很容易地將新的或現(xiàn)有資源放入.resx文件中。然后,可以使用My很容易地訪問(wèn)這些資源。您只需編寫(xiě)以下內(nèi)容:
DimSmileyBitmapasDrawing.Bitmap=My.Resources.Smiley
線程處理
My中可用的類(lèi)實(shí)例是通過(guò)緩和線程處理問(wèn)題的方式公開(kāi)的,因?yàn)镸y對(duì)象的實(shí)例是逐線程提供的。即,線程1上返回的My.Computer的實(shí)例不同于線程2上返回的My.Computer的實(shí)例。這意味著當(dāng)使用My對(duì)象時(shí),您不必編寫(xiě)同步代碼。
在Web應(yīng)用程序中,從My返回的實(shí)例是根據(jù)請(qǐng)求存儲(chǔ)的。
小結(jié)
我們已經(jīng)研究了My如何公開(kāi).NETFramework類(lèi)以及如何生成動(dòng)態(tài)生成的類(lèi)以補(bǔ)充My。
最后,My可以減少您必須編寫(xiě)的代碼行數(shù),并提供對(duì)常用功能的訪問(wèn)。它以有效、可靠且線程安全的方式實(shí)現(xiàn)這一目的。在程序員工作效率顯得尤為重要的環(huán)境中,My可以幫助您更加快速有效地完成工作。
->新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注