|
Visual Basic不同于Visual C#、Visual C++之處在于它更偏重于快速開發(fā),更針對非專業(yè)開發(fā)人員和編程新手。Visual Basic 2005這次提供的“My”是一個(gè)極為出色的設(shè)計(jì),可以幫助開發(fā)人員快速利用.NET Framework中的各種功能進(jìn)行開發(fā)。說到My到底是什么,其實(shí)它就是一個(gè)工程相關(guān)的命名空間,其中的內(nèi)容是由IDE幫助你組織的。 在My出現(xiàn)以前,.NET Framework已經(jīng)具有強(qiáng)大而豐富的類庫,學(xué)習(xí)這些類庫算不上是一件輕松的事。許多VB或VC的開發(fā)者第一次接觸到.NET開發(fā)時(shí),總是習(xí)慣于自己實(shí)現(xiàn)或通過調(diào)用Windows API實(shí)現(xiàn)某些.NET早已準(zhǔn)備好的功能。其原因就是.NET類庫太龐大太分散了,許多常用的功能與那些不太常用的功能混在一起。比如,獲得從當(dāng)日零點(diǎn)開始的毫秒數(shù)的方法(經(jīng)常被用來做隨機(jī)數(shù)的種子)竟然與設(shè)置環(huán)境變量功能同在Environment類中,而不是“看上去像是”的System.Timers、TimeSpan或DateTime等命名空間或類型中。許多開發(fā)者對類庫不熟悉,于是就一遍又一遍地重復(fù)開發(fā).NET Framework的功能。Visual Basic Team為了解決這個(gè)問題,設(shè)計(jì)了My命名空間,它將.NET Framework中最常用的功能挑出來,然后按照最容易理解的邏輯結(jié)構(gòu)存放在一起。當(dāng)你深入My命名空間,你會(huì)發(fā)現(xiàn)那些功能就在你憑直覺就能想象到的路徑中。 My命名空間在當(dāng)前版本中主要包含My.Application、My.Computer、My.Resources、My.User、My.Forms和My.Webservices等六個(gè)主要部分。你可以輸入My關(guān)鍵字找到他們,也可以導(dǎo)入My命名空間,其語法是:Imports 項(xiàng)目名稱.My My.Application 在My命名空間中的所有類或?qū)ο笾?,My.Application是與當(dāng)前運(yùn)行的應(yīng)用程序有關(guān)的對象,本次首先來介紹My.Application。My.Application提供的功能非常豐富,比如當(dāng)前應(yīng)用程序的主線程、主窗口、版本或公司版權(quán)等信息、文化和語言設(shè)置、路徑及命令行、事件日志甚至Splash Screen的信息。下面的表格列出了My.Application的全部功能。
可以注意到,My.Application中的某些功能和Application對象是一樣的,但是My.Application不僅僅能用于Windows Form的應(yīng)用程序,許多功能在控制臺(tái)應(yīng)用程序照樣能夠使用。下面舉幾個(gè)簡單的例子來使用My.Application: 1、顯示一個(gè)簡單的關(guān)于窗口。 With My.Application.AssemblyInfo 2、將當(dāng)前打開的所有窗口的標(biāo)題都改為環(huán)境變量%TITLE%的值 For Each f As Form In My.Application.OpenForms 3、檢查如果從網(wǎng)絡(luò)上部署,修改當(dāng)前用戶界面文化設(shè)置為英語-美國 If My.Application.IsNetworkDeployed Then My.Computer My.Computer可能是My命名空間中最有趣的部分了,這一部分封裝了大量訪問系統(tǒng)和硬件信息的功能,操作起來比直接使用.NET Framework或Windows API都方便得多。My.Computer中有很多對象,下面我們分別來介紹。 My.Computer.Audio Audio對象提供了播放音頻的功能,它既可以從wav等文件播放,也可以從音頻數(shù)據(jù)流來播放,就是說你可以用它輕松播放儲(chǔ)存在資源文件中或者數(shù)據(jù)庫中的音頻。播放時(shí)還可以指定后臺(tái)播放或等待結(jié)束等多種設(shè)置。結(jié)合My.Resources來使用,更顯得方便無窮。這是一個(gè)簡單的播放wav文件的例子: My.Computer.Audio.Play("c:/ding.wav", AudioPlayMode.BackgroundLoop)
My.Computer.Clipboard Clipboard對象提供了以強(qiáng)類型方式讀寫剪貼板的功能,比Windows.Forms里面的剪貼板更加好用。使用Clipboard對象可以直接從剪貼板讀寫音頻、圖像、文本甚至我的電腦中的文件拖放信息。此外,由VB6升級的項(xiàng)目現(xiàn)在將直接使用My.Computer.Clipboard對象升級以前的Clipboard對象,這將解決VB.NET不能升級原先剪貼板功能的缺陷。下面的例子將文本框內(nèi)的內(nèi)容復(fù)制到剪貼板: My.Computer.Clipboard.SetText(TextBox1.Text) My.Computer.Clock Clock對象是一個(gè)獲取時(shí)間的工具,它可以直接獲取當(dāng)?shù)貢r(shí)間、中時(shí)區(qū)的時(shí)間和從當(dāng)時(shí)子時(shí)開始的毫秒計(jì)數(shù)。 My.Computer.FileSystem 這是微軟Visual Basic Team在My.Computer中傾注最多精力的對象,使用它可以充分改善文件操作的復(fù)雜程度。FileSystem對象提供了易于理解的操作方式。FileSystem對象中復(fù)制文件的方法不但只需要指定目標(biāo)路徑,還可以幫助你建立目標(biāo)目錄中不存在的級別。它還特別提供了CopyDirectory的功能,可以復(fù)制整個(gè)目錄!這正是目前.NET Framework缺乏的功能。同時(shí)FileSystem還能提供搜索上級目、子目錄或根目錄的功能,非常體貼。下面例子展示了如何在動(dòng)畫演示下將文件放入回收站。 My.Computer.FileSystem.DeleteFile("c:/mybigfile.big", True, True) FileSystem對象還提供了只用一行代碼就可以讀取文本文件內(nèi)容,或者將所需內(nèi)容寫入文本文件的功能,現(xiàn)在你不需要再用迷惑人的StreamReader、StreamWriter來讀寫文件了,還不用擔(dān)心資源釋放的問題。如下面的例子: s = My.Computer.FileSystem.ReadAllText("c:/a.txt") 除了可以通過My訪問以外,通過System.IO.FileSystem類也可以完成FileSystem對象的大多數(shù)功能,這種方式似乎更適合于使用C#或C++的開發(fā)者。 My.Computer.Info 看名字就知道了,這個(gè)對象的屬性都是系統(tǒng)信息。如果你想獲得本機(jī)物理內(nèi)存或虛擬內(nèi)存的總數(shù),剩余量、操作系統(tǒng)名稱、當(dāng)前用戶名、本機(jī)安裝的文化設(shè)置等等,都可以輕松使用Info對象,它讓你對應(yīng)用程序所在的系統(tǒng)了如指掌。 My.Computer.Keyboard和My.Computer.Mouse 通過這兩個(gè)對象,你可以快速獲得用戶鍵盤的信息,如大寫鎖定、數(shù)字鍵盤鎖定等是否打開,以及鼠標(biāo)有幾個(gè)按鍵,是否配備滾輪等。如果你希望你的應(yīng)用程序能夠做到最體貼用戶,那這些信息是少不了了。下面例子演示獲取用戶的鼠標(biāo)左右鍵功能是否交換(這樣你就可以知道用戶是不是左撇子,從而提供更體貼的界面,多爽) Dim f As Boolean = My.Computer.Mouse.ButtonsSwapped My.Computer.Name 不用多說,這就是本機(jī)操作系統(tǒng)安裝時(shí)輸入的名稱 My.Computer.Network 這個(gè)Network對象充分簡化了最常用的網(wǎng)絡(luò)任務(wù),只需要一行代碼,就可以Ping一個(gè)地址,或者檢測網(wǎng)絡(luò)是否接通。還能用一行代碼下載或上傳文件。比如這個(gè)例子就完成了一個(gè)下載文件的任務(wù): If My.Computer.Network.IsAvailable Then 提供了用一行代碼打開本機(jī)串口的功能,還能立刻綁定一個(gè)事件監(jiān)視串口的變化?,F(xiàn)在串口編程出奇的簡單,再也不需要MSComm控件了。 My.Computer.Printers 這個(gè)Printers對象能夠遍歷本機(jī)所安裝的所有打印機(jī),還能找出默認(rèn)的打印機(jī)。通過向默認(rèn)打印機(jī)畫圖一樣的操作,就能開始打印了。這樣的操作會(huì)讓你想起VB6時(shí)代便利而簡潔的打印操作。下面的例子將在默認(rèn)打印機(jī)上打印一個(gè)橢圓。從VB6升級項(xiàng)目時(shí),原來的Printer對象將自動(dòng)升級為My.Computer.Printers中的相關(guān)操作,升級的用戶可以更加放心了。 My.Computer.Printers.DefaultPrinter.DrawEllipse( _ My.Computer.Registry 這個(gè)注冊表對象可比Microsoft.Win32空間中的那個(gè)版本簡單多了,他提供強(qiáng)類型的路徑支持,還能非常方便地讀寫注冊表。下面的例子是一段內(nèi)置的代碼片斷,演示了如何判斷某一鍵值是否存在。 Dim exists As Boolean = True Dim path As String = "Software/Microsoft/TestApp/1.0" If My.Computer.Registry.CurrentUser.OpenSubKey(path) Is Nothing Then My.Computer.Screen Screen對象可以獲取屏幕的可視范圍,像素的位數(shù)等。比VB6的Screen對象更強(qiáng)的是,它現(xiàn)在支持兩個(gè)顯示器。
My.Resources和My.User 從原理上來說,My.Resources與前面介紹的My.Computer或My.Application是完全不同的,他帶來的是另一種方便。My.Resource不是一個(gè)類庫,而是My命名空間中唯一一個(gè)子命名空間。他的功能是什么呢?我們先回憶一下在.NET Framework1.1時(shí)代使用資源的情形。首先我們得通過工具,將圖片、文本或聲音等資源添加到資源列表中,編譯成資源文件,再嵌入到我們的程序集中。當(dāng)我們要使用資源的時(shí)候,必須通過System.Resources.ResourceManager從程序集中提取資源,然后自行判斷資源的類型,做適當(dāng)?shù)霓D(zhuǎn)化并使用。比如從Form1的資源中取出ID為Greeting的字符串,需要寫這么多代碼: Dim manager As New System.Resources.ResourceManage( _ 而且那個(gè)編輯resx的界面不太直觀,只添加字符串資源就不太方便,要想添加圖片、音樂等文件到資源文件并在程序中取用就更麻煩了。到現(xiàn)在,許多Visual Basic .NET程序員還總是詢問將圖片音樂嵌入到EXE文件中去的方法。.NET Framework 2.0為解決這個(gè)問題引入了一個(gè)新特性——強(qiáng)類型資源。首先ResourceManager增加了一個(gè)GetStream()方法,方便獲取圖片、聲音類的資源,其次Resgen工具可以根據(jù)資源的內(nèi)容生成一個(gè)包裝類,通過它可以直接強(qiáng)類型地讀些程序集內(nèi)的資源。而Visual Basic 2005將強(qiáng)類型資源與VB的IDE的特性結(jié)合在一起,就成了方便無比的My.Resources。 在實(shí)際使用My.Resources之前,我們先看看Visual Basic 2005新的資源編輯器,它現(xiàn)在已經(jīng)繼承到了項(xiàng)目屬性中。打開項(xiàng)目屬性并切換到Resources選項(xiàng)卡,我們可以看到如下的資源編輯器。 從頂端的下拉列表框中,可以選擇資源的類型——聲音、圖像、文本、文件、圖標(biāo)或其他自定義內(nèi)容。選擇相應(yīng)的類別,下面的編輯器就會(huì)發(fā)生變化,以適應(yīng)當(dāng)前類型的資源。每種類別都可以添加任意數(shù)量的資源。比如我們添加一個(gè)名稱為Greeting的字符串,并讓它的值等于"Hello",然后切換到代碼窗口,輸入My.Resource.看到什么了?Greeting彈出來了?,F(xiàn)在我們使用這個(gè)資源之需要一行代碼了。對比剛才所述的舊方法,你感到方便之處了嗎? Dim s As String = My.Resources.Greeting 如果我們添加了圖片資源,那么也可以直接使用My.Resources來訪問,而且就是BitMap類型,你想怎樣用它就可以怎樣用它,比如: BackgroundImage = My.Resources.MyPic 一行代碼就可以輕輕松松將窗口背景設(shè)置為資源中的圖片。如果儲(chǔ)存了聲音資源,那么結(jié)合My.Computer.Audio的功能,播放資源中的聲音也變得如此簡單: My.Computer.Audio.PlaySound(My.Resources.MySound) 想象一下以前要多少代碼才能完成這樣一個(gè)任務(wù)!有了My.Resource,資源的使用變得非常簡單,你一定會(huì)改變對使用資源的看法,而愛上在自己的程序中使用資源的。 My.User是My命名空間中最小的成員,但是別看他小,功能對于.NET新手來說卻不簡單。如果你初次接觸.NET開發(fā),要獲取當(dāng)前登陸用戶的用戶名和用戶組怎么辦呢?誰會(huì)想到它其實(shí)是和Thread.CurrentPrincipal屬性有關(guān)呢?My.User簡單地將用戶名和角色信息提供給你,要想獲得當(dāng)前登錄的用戶名,只需要輸入My.User.Identity就行了。
My.Forms和My.WebServices 如果說My.Application、My.Computer和My.User是VB2005提供的匯集常用功能的類庫,My.Resources是一個(gè)對項(xiàng)目資源的強(qiáng)類型封裝,那么My.Forms和My.WebServices就是一個(gè)窗體和Web服務(wù)使用模式的絕佳范例。從VB6升級至Visual Basic .NET的程序員往往對VB.NET新的窗體編程模式不適應(yīng)。因?yàn)閂B.NET的窗體是類,必須要?jiǎng)?chuàng)建實(shí)例才能使用,而VB6的窗體則既是類又是對象,無須創(chuàng)建實(shí)例就能使用。在VB.NET中,往往要用這樣的語法來使用窗體: Dim frmForm2 As New Form1() 然而用這樣的語法顯示窗體,各個(gè)窗體之間的通信或數(shù)據(jù)傳遞就十分困難。比如新生成的frmForm2要想訪問另一個(gè)窗體Form1就難以做到,因?yàn)閒rmForm2無法獲得Form1實(shí)例的引用。許多初學(xué)者在使用窗體的時(shí)候弄不清類、實(shí)力和引用之間的關(guān)系因此常常遇到苦難。即使熟悉了這些概念,有時(shí)仍不能用正確的方法解決窗體互相訪問的問題。許多解決方案,如通過構(gòu)造函數(shù)傳遞數(shù)據(jù),通過全局變量或者靜態(tài)變量,甚至在模塊中生成項(xiàng)目中所有窗體的實(shí)例等等都不是十分理想,他們會(huì)增加窗體之間的耦合性,或者浪費(fèi)內(nèi)存。為了徹底解決窗體創(chuàng)建和互相訪問的問題,Visual Basic 2005引入了My.Forms。My.Forms雖然在My命名空間中,但是使用它不需要輸入My.Forms。假設(shè)你有兩個(gè)窗體——Form1和Form2,F(xiàn)orm1是啟動(dòng)窗體,現(xiàn)在你要用代碼顯示Form2,新的語法是這樣的: Form2.Show 這種用法和VB6幾乎一樣。Form2是窗體的類,怎么可以直接使用了呢?因?yàn)镸y.Forms為項(xiàng)目中每一個(gè)窗體維護(hù)了一個(gè)默認(rèn)實(shí)例,其實(shí)現(xiàn)方法很像Singleton模式——每個(gè)窗體都有一個(gè)默認(rèn)實(shí)例,而且有一個(gè)全局訪問點(diǎn),就通過窗體的類名即可訪問到。這種方式徹底解決了窗體互相訪問的問題,因?yàn)槊總€(gè)窗體都可以隨時(shí)訪問到任何其它的窗體的默認(rèn)實(shí)例。比如要在Form2中修改Form1中一個(gè)TextBox的文字,只需要這樣: Form1.textBox1.Text = "Hello" 不在需要任何傳遞參數(shù)的構(gòu)造函數(shù)或者靜態(tài)/全局變量。一個(gè)項(xiàng)目中多數(shù)窗體都是只需要一個(gè)實(shí)例的,所以這種模式適合任何項(xiàng)目使用。無論是新手或老手,我都建議盡情使用My.Forms的功能,他是解決窗體互訪的最佳模式,同時(shí)不會(huì)浪費(fèi)內(nèi)存,因?yàn)樗挥性诘谝淮卧L問所需窗體的時(shí)候才建立它。 My.WebServices的原理與My.Forms如出一轍,因?yàn)樵瓉鞼ebService的代理類都需要手工創(chuàng)建對象才能使用。而WebService對于項(xiàng)目全局應(yīng)該有一個(gè)一致的訪問點(diǎn),所以VB2005將代替你創(chuàng)建代理類的實(shí)例,并維護(hù)于My.WebServices中,你可以隨時(shí)訪問他。比如你的項(xiàng)目添加了一個(gè)Web引用到Service1服務(wù),它提供了一個(gè)方法叫Method1,以前的Visual Basic你必須寫成: Dim myService1 As New Service1() 而現(xiàn)在,無論在何地,你都可以直接寫: myResult = My.WebServices.Service1.Method1() 而無須手工創(chuàng)建代理類的對象了。
My命名空間之高級用法 但是對于一些高級用戶來說,這些功能還顯得有所欠缺。老手們有時(shí)也編寫了類似My功能的類或函數(shù),要是能把他們放到My命名空間中多好。My就像一個(gè)可隨時(shí)訪問的工具箱,除了里面已經(jīng)有的工具以外,當(dāng)然允許我們將自己的東西放進(jìn)去。下面我們就來看看怎么擴(kuò)展My命名空間。 添加自定義的類或模塊 如果我們想要放進(jìn)My中的函數(shù)都是靜態(tài)的,那么直接把類或模塊放入My命名空間是個(gè)方便的方法,做法非常簡單,只要將類或模塊定義在My命名空間中即可 Namespace My 現(xiàn)在就可以直接用My.Tools來訪問自定義的模塊,很方便。 添加自定義類的實(shí)例 如果我們觀察Visual Basic所提供的My命名空間成員,將發(fā)現(xiàn)他們都不是類本身,而是對象。因?yàn)樗械姆椒ǘ甲龀伸o態(tài)畢竟不是最佳方法,我們有時(shí)候需要將一些自定義類的實(shí)例放到My命名空間中,這樣不用的時(shí)候就比較節(jié)省內(nèi)存,而且易于控制資源釋放的問題。首先我們要定義自定義類,可以放在任何地方,而不必放到My命名空間中,這樣就可以避免類名直接顯示在My關(guān)鍵字后。然后,在My命名空間下,定義一個(gè)帶有HideModuleNameAttribute的模塊,名稱可以隨便起;最后在模塊中設(shè)定訪問自定義類實(shí)例的屬性。假設(shè)我們的自定義類叫ToolsProxy,而自定義屬性叫Tools,那么可以這樣寫: 'Namespace My 有了HideModuleName這個(gè)Attribute,它本身就不會(huì)出現(xiàn)在My關(guān)鍵字后面,而它的屬性則會(huì)顯示。完成以后,你會(huì)發(fā)現(xiàn)My.Tools這次與Visual Basic內(nèi)置在My中的對象沒有任何區(qū)別了。此方法為擴(kuò)展My最佳的方法,推薦使用。 擴(kuò)展My.Application或My.Computer 有時(shí)候,我們不僅要將自定義的類添加到My中,還希望更進(jìn)一步直接補(bǔ)充My.Application或My.Computer本身的功能。而這完全可以做到。Visual Basic提供了Partial關(guān)鍵字,他可以擴(kuò)寫當(dāng)前項(xiàng)目中的類或結(jié)構(gòu),無論原先定義的時(shí)候是否加上了Partial關(guān)鍵字。于是我們就可以利用這一特征擴(kuò)寫定義看不見的My.Application或My.Computer。My.Application對應(yīng)的是MyApplication類,而My.Computer對應(yīng)的是MyComputer類。比如我們要給My.Computer增加一個(gè)新的功能——CdRomDriver屬性,用以控制光驅(qū)的彈出、縮進(jìn)與自動(dòng)運(yùn)行,就可以直接在My命名空間下擴(kuò)寫MyComputer類,如下: 'Namespace My Partial Class MyComputer 這樣就成功地給My.Computer添加了新的屬性,你會(huì)發(fā)現(xiàn)My.Computer.CdRomDriver和其他My.Computer有完全一樣的行為。同樣,My.Application也可以通過Partial并添加自定義屬性的方式進(jìn)行擴(kuò)展。 現(xiàn)在我們可以看出,My命名空間是完全開放和可編程的,我們可以自由發(fā)揮想象力,創(chuàng)造完全屬于自己的My命名空間。 也許說到這里,C#的程序員已經(jīng)很眼饞了,能不能在C#中使用My命名空間呢?答案是能,又不能。C#的設(shè)計(jì)者沒有提供通過My來訪問對象的方法,那么直接使用My是不可能了。但是Visual Basic的設(shè)計(jì)者已經(jīng)考慮到了這些問題,將My命名空間中大多數(shù)功能開放了出來,讓C#和其他語言的程序員可以用到他們。 在C#中使用My.Application 要使用My.Application,必須要繼承System.Windows.Forms.WindowsFormsApplicationBase(該類位于Microsoft.VisualBasic.dll中)。繼承之后我們要做幾件事情,首先書寫構(gòu)造函數(shù)初始化MyApplication類,在Visual Basic中這些設(shè)置均為IDE生成,而C#則需要手工書寫。然后重寫OnCreateMainForm方法,這個(gè)方法設(shè)定了當(dāng)前應(yīng)用程序的主窗體。接下來書寫My類,讓他提供對MyApplication類的全局訪問點(diǎn)。最后改寫Main,在其中執(zhí)行My.Application.Run()代替原來的Application.Run(),具體做法如下。 namespace WindowsApplication2.Properties 修改Main函數(shù): [STAThread] 這樣我們就充分獲得了My.Application的對象模型。但是有些動(dòng)態(tài)生成的內(nèi)容,如SplashScreen對象等,除非自己書寫,否則無法使用。通過這種方法使用My.Application可以獲得許多額外的好處,比如獲得My.Application的事件支持,他們是跟應(yīng)用程序運(yùn)行狀態(tài)密切相關(guān)的事件,非常有用。但是由于缺乏自動(dòng)代碼的支持,不能保證My.Application事件的全部行為都和Visual Basic一樣。 在C#中使用My.Computer 要使用My.Computer我們無需像Application那樣費(fèi)勁了。Visual Basic的設(shè)計(jì)者將大部分供能放到了System的自命名空間中,可以很自然地使用他們:
注:System.Reflecton.AssemblyInfo只是My.Applicaton.AssemblyInfo的類型。 當(dāng)然這不如Visual Basic中那樣豐富,但是一般應(yīng)用有FileSystem就足夠了,其他功能用.NET Framework原本的方法也很簡單。要注意,盡管這些類分散在System的各個(gè)字命名空間中,但是全部都位于Microsoft.VisualBasic.dll中,需要引用它才能使用。 在C#中使用My.Resources和My.Settings 一個(gè)好消息是,C#也內(nèi)置了這兩樣功能,只要把My換成Properties就可以使用了,和Visual Basic一樣方便。但是My.User、My.Forms和My.WebServices是真的沒有了,要實(shí)現(xiàn)他們的功能,需要完全手工編碼。 |
|
|