摘要:概述了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可以幫助您更快速有效地完成工作。
->