电竞比分网-中国电竞赛事及体育赛事平台

分享

Visual Basic 2005新功能——My命名空間

 猛小妖 2011-09-26

 

      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 成員 描述
ApplicationContext 應(yīng)用程序的上下文,包括主線程和主窗體的信息
AssemblyInfo 程序集信息,包括版本、版權(quán)、標(biāo)題、產(chǎn)品名稱和可執(zhí)行名稱等
ChangeCurrentCulture 改變應(yīng)用程序當(dāng)前文化設(shè)置,如貨幣和時(shí)間的格式
ChangeCurrentUICulture 改變應(yīng)用程序當(dāng)前的用戶界面文化設(shè)置,如顯示語言和用詞
CommandLineArgs 一個(gè)只讀集合,返回當(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í)行儲(chǔ)存在Windows消息隊(duì)列中的所有Windows消息
Exit 退出應(yīng)用程序
GetEnvironmentVariable 通過環(huán)境變量的名字獲取環(huán)境變量的值
IsNetworkDeployed 返回一個(gè)值,指示當(dāng)前應(yīng)用程序是否采用了網(wǎng)絡(luò)部署方式
Log 一個(gè)記錄應(yīng)用程序事件日志和異常的日志工具
MainForm 當(dāng)前應(yīng)用程序的主窗體
OpenForms 當(dāng)前應(yīng)用程序中所有已經(jīng)打開窗體的集合,與VB6的Forms集合功能相同
Run 啟動(dòng)Visual Basic的啟動(dòng)/關(guān)閉應(yīng)用程序模式
SplashScreen 返回當(dāng)前應(yīng)用程序作為Splash Screen的窗口

可以注意到,My.Application中的某些功能和Application對象是一樣的,但是My.Application不僅僅能用于Windows Form的應(yīng)用程序,許多功能在控制臺(tái)應(yīng)用程序照樣能夠使用。下面舉幾個(gè)簡單的例子來使用My.Application:

1、顯示一個(gè)簡單的關(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ù)流來播放,就是說你可以用它輕松播放儲(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
    My.Computer.Network.DownloadFile("
http:///x.zip", _
        "C:/download")
End If

My.Computer.Port

提供了用一行代碼打開本機(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( _
    New RectangleF(2, 2, 50, 150), 1)
My.Computer.Printers.DefaultPrinter.Print()

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
    exists = False
End If

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( _
    "MyApp.Form1", Me.GetType().Assembly)
Dim s As String = manager.GetString("Greeting")

而且那個(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()
frmForm2.Show

然而用這樣的語法顯示窗體,各個(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()
Dim myResult As Integer = myService1.Method1()

而現(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
    Public Module
Tools
        Public Sub DoSomething()
            'Some code here
        End Sub
    End Module
End Namespace

現(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()> _
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這個(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
    Public ReadOnly Property CdRomDriver() As CdRomDriver
        Get
            'Codes here
        End Get
    End Property
End Class

這樣就成功地給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
{
    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的對象模型。但是有些動(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的自命名空間中,可以很自然地使用他們:

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的各個(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)他們的功能,需要完全手工編碼。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多