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