細(xì)說VB.NET(上)
創(chuàng)新互聯(lián)公司于2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元揭東做網(wǎng)站,已為上家服務(wù),為揭東各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:028-86922220
(作者:青蘋果工作室編譯 2001年03月07日 14:47)
微軟公司提出的.NET概念,正從各個(gè)方面滲入到我們的生活中。它將產(chǎn)生的作用,
誠如一位業(yè)內(nèi)名家所描述的:“請(qǐng)忘掉你認(rèn)為你所知道的,.NET將改變一切”!既然如
此,無論是IT業(yè)內(nèi)人士、還是企業(yè)決策者,快速領(lǐng)會(huì)這個(gè)新概念的含義及深遠(yuǎn)影響,
都顯得非常必要。
概要
VB正在不斷地發(fā)展中,它具備了以前VB編程人員作夢(mèng)都想擁有的性能,想象一下你
將隨心所欲的利用這些性能,是不是很令人激動(dòng)?然而,這個(gè)計(jì)劃于2001年第四季度上
市銷售的VB版本可能會(huì)給你帶來些小麻煩,因?yàn)橐耆莆账枰粋€(gè)較長(zhǎng)的學(xué)習(xí)周期
,而且其中包括了一些微妙的變化,你可能在使用他們的時(shí)候出現(xiàn)錯(cuò)誤。
需要準(zhǔn)備的條件:建議獲得Visual Basic.NET beta 版,這些內(nèi)容對(duì)所有VB程序員
都是有用的。
Microsoft .NET平臺(tái)的涵蓋面很廣,而且很難預(yù)測(cè)它的真正意義。我們注意到,現(xiàn)
在有很多關(guān)于.NET的不正確的理解。因此在這篇文章里,我們將把給你一個(gè)VB.NET到底
是些什么的概念,從頭到尾說一說它是什么、它能干什么以及怎樣才能充分發(fā)揮它的優(yōu)
點(diǎn)。我們要特別地細(xì)看一下IDE的改變、面向?qū)ο筇卣?、底層結(jié)構(gòu)的改變、一些“現(xiàn)代化
”的語法以及包裝和分發(fā)方面的增強(qiáng)。我們將討論這些功能能為你做什么,解釋他們的
優(yōu)點(diǎn)與不足。由于這些改變是如此之大,而且涉及方方面面,因此希望這一篇文章能滿
足你全部的要求是不現(xiàn)實(shí)的,要了解這方面全部的知識(shí)請(qǐng)參閱有關(guān)文章和書籍。
Visual Basic.NET 和你現(xiàn)在所知的開發(fā)工具完全不同,并且這個(gè)新版本會(huì)改變你的
未來。到底有多大不同?如果你覺得從VB3遷移到VB4是一個(gè)很大的變化,那這次VB.NET
會(huì)讓你感到震驚。這次升級(jí)與其說是VB的一個(gè)新版本,還不如說是遷移到一個(gè)新平臺(tái)上
,你所面臨的情況就和從DOS遷移到Windows差不多。
VB獲得了繼承能力
VB.NET預(yù)期擁有的第一新功能就是繼承能力。繼承是VB開發(fā)者長(zhǎng)期以來要求得最多
的功能。判斷一下對(duì)繼承的要求是不是像早些時(shí)候?qū)Ρ镜鼗幾g器的要求一樣將是一件
很有意思的事,后者,當(dāng)Microsoft提供了一個(gè)以后,你就幾乎聽不到多少這方面的言語
了。
Visual Basic現(xiàn)在是真正的面向?qū)ο笳Z言了。過去,你可以通過使用VB的界面繼承
性創(chuàng)建偽實(shí)現(xiàn)的對(duì)象繼承,但現(xiàn)在不必這樣做了。
Visual Basic.NET 現(xiàn)在提供大量面向?qū)ο蠊δ?,包括?yīng)用程序繼承,它允許你從其
它類導(dǎo)出你想創(chuàng)建的類。像在其它面向?qū)ο笳Z言里一樣,你能覆蓋基類的方法和屬性,
并且能實(shí)現(xiàn)多態(tài)以創(chuàng)建健壯的、擴(kuò)展性好的組件。例如,假定你從基類 Crane里繼承產(chǎn)
生了一個(gè)ForkLift類,你能使用像下面的代碼覆蓋基類里對(duì)Lift方法的默認(rèn)實(shí)現(xiàn):
Public Class ForkLift
Inherits Crane
Overrides Sub Lift(ByRef _
Height As Double)
Height = Height + 10
End Sub
End Class
VB.NET不僅能讓你覆蓋方法或?qū)傩裕凰€能讓你重載方法。重載是定義同名、但使
用不同數(shù)據(jù)類型的方法或?qū)傩缘哪芰?。例如,假定你有一個(gè)組件能對(duì)不同數(shù)據(jù)類型的數(shù)
組進(jìn)行排序,你不需要三個(gè)(每種數(shù)據(jù)類型一個(gè))不同名的方法;實(shí)際上你可以重載一個(gè)
方法名:
Overloads Sub SortArray(ByRef _
aValues()As String)
...
Overloads Sub SortArray(ByRef _
aValues() As Integer)
...
Overloads Sub SortArray(ByRef _
aValues() As Object)
另一個(gè)改變是:表單現(xiàn)在是類模塊。這就是說類本身包含建立表單的所有“肥料”
的代碼。你可能想知道,為什么你不得不看到這些從前不用看的代碼,但這個(gè)改變同時(shí)
帶來強(qiáng)大的新功能,包括繼承這些表單的能力。Microsoft把這一技術(shù)稱為可視化繼承。
假定你的對(duì)話框有一種標(biāo)準(zhǔn)的格式,例如在表單的一側(cè)有一行按鈕,并在角上有一個(gè)標(biāo)
識(shí),那么,通過可視化繼承你能創(chuàng)建一個(gè)表單模板(類),并從這個(gè)基類里導(dǎo)出所需的表
單。
一切都是對(duì)象
代碼復(fù)用簡(jiǎn)化了開發(fā)過程,像實(shí)現(xiàn)和可視化繼承這樣的功能有利于更簡(jiǎn)單、更強(qiáng)大
的代碼復(fù)用。然而,代碼復(fù)用并不是到此為止。你能通過支持VB.NET的通用語言運(yùn)行庫
(Common Language Runtime - CLR)繼承在其它 VS.NET 語言里定義的類。例如,你或別
人創(chuàng)建了一個(gè) C# 類,然后就能從 VB 里繼承它。
VB.NET 的面向?qū)ο竽芰U(kuò)展了語言本身的通路:一切都是對(duì)象。這意味著比在以前
的 VB 版本里,你獲得了更多的內(nèi)在功能,你將很少被迫使用 Windows API。例如,在
以前的 VB 版本里,你使用 LoadPicture 方法加載圖片并使用表單的 Line 方法(或較
快的 API) 畫線。現(xiàn)在,你使用 System.Drawing 對(duì)象來創(chuàng)建并處理圖形。你可以使用
以下代碼在表單上顯示一幅圖片:
picshowpicture.Image = _
system.Drawing.Image.FromFile( _
"c:\test.bmp")
注意 VB.NET 的“一切都是對(duì)象”方式讓你的語句能用得更長(zhǎng)久。
考慮以下語句,它在一個(gè)圖形對(duì)象上畫一條黃綠色的線:
objgraphics.DrawLine(system.Drawing. _
Pens.Chartreuse, 0, 0, 100, 100)
這些長(zhǎng)長(zhǎng)的語句也有好處:改進(jìn)的功能、適應(yīng)性和易用性。從前,你要實(shí)現(xiàn)先進(jìn)的
功能就不得不在文檔中挖掘,經(jīng)常是不得不訴諸API。現(xiàn)在,相關(guān)的功能集符合邏輯地包
含在對(duì)象里。這種處理方式的另外一個(gè)好處就是:類把相關(guān)的功能很好的組織了起來。
所以,瀏覽你感興趣的對(duì)象,發(fā)現(xiàn)它們做些什么實(shí)際上很有意思。
Visual Basic.NET 的面向?qū)ο蠊δ芴峁┝撕芏鄬?shí)在的好處。很多情況下,VB.NET
面向?qū)ο蟮谋举|(zhì)和實(shí)現(xiàn)的繼承性能幫助你比在以前的 VB 版本里更容易、更迅速地創(chuàng)建
特定類型的功能。然而,你不一定要僅僅因?yàn)槟隳茏龅?,就使用?shí)現(xiàn)繼承性或其它 .NE
T 功能。VB.NET 的新功能使開發(fā)許多類型的應(yīng)用程序變得更簡(jiǎn)單!但是,就像使用所有
的語言能力一樣,你需要使用的是在特定場(chǎng)合下最適合的功能。
自由線程的危險(xiǎn)
對(duì)于自由線程可能需要特別給出警告。VB6允許你使用獨(dú)立的線程來創(chuàng)建多線程服務(wù)
器程序,但VB過去從來沒有讓你能創(chuàng)建自由線程的客戶端程序。VB.NET 改變了這一切。
現(xiàn)在,創(chuàng)建自由線程應(yīng)用程序幾乎成了最微不足道的事情。實(shí)際上,我估計(jì)那些沒有理
解其中的微妙差別,就在他們的應(yīng)用程序里添加了自由線程的程序員會(huì)遇到很多問題。
只需要幾行代碼就能啟動(dòng)一個(gè)新線程:簡(jiǎn)單地將線索對(duì)象的地址傳遞給方法,方法本身
就會(huì)啟動(dòng)線程。這確實(shí)是很酷也很有用的東西,但你需要小心:這些功能適用于特定的
場(chǎng)合,確定哪些是適用的場(chǎng)合并且明智的使用這些工具則是你自己的事。許多開發(fā)者使
用繼承性和自由線程時(shí)給自己找了不少麻煩,請(qǐng)不要讓這些發(fā)生在你身上。
可能大家討論得最多的 VB.NET 特征就是 CLR (通用語言運(yùn)行庫),VB 運(yùn)行在它的
頂層上。是 CLR 提供了 VB.NET 的許多關(guān)鍵功能。例如,CLR 使實(shí)現(xiàn)和跨語言繼承性以
及自由線程成為可能。
分發(fā)VB程序要求你同時(shí)分發(fā)VB的運(yùn)行庫,在VB6里即是msvbvm60.dll。許多其它語言
也有類似的要求,包括 C++ 和 Java。在Visual Studio.NET里,所有的Visual Studio
語言共享同一個(gè)運(yùn)行庫:CLR。這里有幾個(gè)較大的變化,首先,所有的Visual Studio語
言現(xiàn)在都共享同一個(gè)IDE、同樣的表單引擎、同樣的異常處理機(jī)制等等。這意味著Visua
l Basic和像 C#這樣的語言擁有同等的地位,至少差不多是同等的。
回復(fù):
細(xì)說VB.NET(中)
(作者:青蘋果工作室編譯 2001年03月07日 14:47)
易于反編譯的中間語言
無論你用VB、C#或其它.NET語言編寫應(yīng)用程序,VS.NET代碼都編譯成為中間語言(I
L)。當(dāng)應(yīng)用程序運(yùn)行時(shí),一個(gè)即時(shí)編譯器(JITter)處理IL代碼并把它編譯成為機(jī)器語言
。這意味著在理論上可能為Windows以外的平臺(tái)創(chuàng)建.NET運(yùn)行庫,但現(xiàn)在關(guān)于類似的事情
還沒有任何官方消息。中間語言的一個(gè)缺陷是:它像VB5以前的VB版本一樣,容易被反編
譯。這種可能性使許多開發(fā)者普遍地質(zhì)疑.NET架構(gòu)的安全性。
CLR在IL層次內(nèi)外影響代碼,對(duì)它的修改將使所有使用CLR的語言受益。然而,語言
只是和代碼如何被解釋為IL有關(guān),對(duì)特定語言的優(yōu)化可以根據(jù)特定語言的語法來編寫,
這樣在技術(shù)上就可能使.NET語言之間的性能差別很小。不管怎樣,大體上藍(lán)圖是美好的
。例如,CLR使VB的調(diào)試和監(jiān)測(cè)工具和C#的相應(yīng)工具相當(dāng),它做到了這一點(diǎn)因?yàn)樗鼈儽緛?/p>
就是相同的工具。
CLR提供不平行的跨語言集成,包括跨語言繼承代碼的能力。所有使用CLR的語言共
享一個(gè)通用類型系統(tǒng),它使使用多種語言開發(fā)應(yīng)用程序變得更簡(jiǎn)單。我不喜歡把 C API
聲明翻譯成VB里可以使用的形式,所以我很贊賞通用類型系統(tǒng)帶來的好處。
在CLR中運(yùn)行的代碼被稱為被管理代碼,被管理代碼使用的內(nèi)存完全由CLR來控制。
被管理代碼帶來很多好處,包括跨語言集成、跨語言異常處理和簡(jiǎn)化的部件相互作用模
型。Visual Basic被限制為只能以被管理代碼的方式工作,然而C#擁有跳到非被管理代
碼的能力(執(zhí)行到運(yùn)行庫之外),并能做像指針操作這類事情。這是VB和C#不同等的情況
之一。這種能力到底有多重要取決于你想干什么。
CLR造成的體系結(jié)構(gòu)差別要比跨語言集成、共享功能和被管理代碼等深刻。首先,V
isual Studio.NET的支撐結(jié)構(gòu)不是 COM。另外,VB.NET里的所有東西,甚至字符串都是
對(duì)象。因?yàn)檫@些和其它一些原因,Microsoft改變了支撐結(jié)構(gòu)處理對(duì)象的方式。COM實(shí)現(xiàn)
了一個(gè)引用計(jì)數(shù)方案,這樣每次引用一個(gè)對(duì)象時(shí),計(jì)數(shù)器遞增。當(dāng)一個(gè)對(duì)象引用超出作
用域或被釋放時(shí),計(jì)數(shù)器遞減,當(dāng)引用計(jì)數(shù)減少到零時(shí)就終止這個(gè)對(duì)象。Microsoft聲稱
在.NET架構(gòu)下引用計(jì)數(shù)的開銷太大,以至于不能在 .NET中實(shí)現(xiàn)它,所以它放棄了引用計(jì)
數(shù)轉(zhuǎn)而使用垃圾收集。
垃圾收集需要新體系結(jié)構(gòu)
CLR垃圾收集器主要是監(jiān)視一個(gè)程序的資源,當(dāng)可用資源達(dá)到確定的閾值時(shí)尋找無用
的對(duì)象,并在發(fā)現(xiàn)它們的時(shí)候清除這些對(duì)象。垃圾收集的一大好處就是你不再需要擔(dān)心
大多數(shù)普通的循環(huán)引用,即子對(duì)象引用了父對(duì)象,然后父對(duì)象又引用了子對(duì)象。在引用
計(jì)數(shù)方案下,循環(huán)引用使兩個(gè)對(duì)象都不能被釋放和清除。然而,垃圾收集器會(huì)發(fā)現(xiàn)循環(huán)
引用并清除它們。這也意味著釋放對(duì)象的最后一個(gè)引用時(shí)不再需要立即清除對(duì)象。
垃圾收集的一個(gè)后果是:你再也不能指望一個(gè)類的 Terminate 事件能在適當(dāng)?shù)臅r(shí)機(jī)
發(fā)出。實(shí)際上,如果線程被阻塞,可能根本就不會(huì)發(fā)出 Terminate 事件。和COM提供的
確定化終止相反,它被稱為不確定的終止。缺乏確定化終止,以及因?yàn)槔占髦匦?/p>
安排并壓縮內(nèi)存從而不能使用指針的事實(shí),在新聞組里激發(fā)了一波激烈的辯論。我想這
些新限制可能會(huì)令你痛恨,因?yàn)槟阋揽看_定化終止;也可能你漠不關(guān)心,因?yàn)槟悴灰?/p>
賴 Terminate 事件。垃圾收集并不是萬靈藥,實(shí)現(xiàn)弱引用依然需要做一些考慮。
從引用計(jì)數(shù)到垃圾收集只是 Visual Studio.NET 的支撐結(jié)構(gòu)不是 COM 這個(gè)事實(shí)的
表象之一。你能在VB.NET中使用COM對(duì)象,比如說ActiveX服務(wù)器或ActiveX控件。然而,
你必須通過包裝訪問這些對(duì)象。任何時(shí)候聽到“包裝”這個(gè)術(shù)語,你應(yīng)該明白你面對(duì)著
性能損失,并且對(duì)象的行為可能有所不同。如果當(dāng)計(jì)劃移植一個(gè)使用了大量COM對(duì)象的工
程,就需要認(rèn)真地測(cè)試和計(jì)劃,可能需要重新規(guī)劃應(yīng)用程序的結(jié)構(gòu)才能移植成功。坦率
地說,你要有遭受挫折的準(zhǔn)備。還記得從VBX遷移到 OCX的過程嗎?我記得,我的精神病
醫(yī)生也記得。我很快就要再去看他了 ;-)
語言本身的變化要遠(yuǎn)遠(yuǎn)超過體系結(jié)構(gòu)的變化。大部分改變確有道理,但我并不認(rèn)為
所有的改變都是如此。以前版本的VB允許你以很多方法來做很多事,以至于統(tǒng)一的編碼
標(biāo)準(zhǔn)要么不存在要么就很難強(qiáng)加于人。Microsoft對(duì)VB做了大量的改變?yōu)榈木褪恰扒逦?/p>
這種語言。很多情況下,原來你有好幾種方法做一件事,現(xiàn)在就只有一種了。Billy Ho
llis 提供了語法變化的詳細(xì)列表,包括廢棄的關(guān)鍵字列表,但有些東西需要在這里重復(fù)
一下。
首先,向過程參數(shù)傳遞數(shù)據(jù)的默認(rèn)方法由引用(ByRef)變成了傳值(ByVal)。這個(gè)改
變主要是因?yàn)橐靡葌髦档娘L(fēng)險(xiǎn)大得多。它的風(fēng)險(xiǎn)主要是調(diào)用過程中的數(shù)據(jù)可能被無
意中篡改。你仍然能通過引用傳遞數(shù)據(jù),但這一改變使你需要修改新的默認(rèn)調(diào)用方法來
使用引用。
Set語句消失了
其次,Set 語句消失了。在 VB.NET 里如果你需要向變量傳遞一個(gè)對(duì)象引用,所需
要的只是一個(gè)等號(hào),對(duì)象被視為同其它值一樣。這很酷,但也有副作用:默認(rèn)屬性消失
了。例如,你不再能用這種方式引用一個(gè)屬性:
Text1 = "What, me worry?"
作為替代,你必須顯式地引用屬性:
Text1.Text = "What, me worry?"
也許一眼看來不需要這種改變,但確實(shí)必須去掉默認(rèn)屬性。例如,假定你有一個(gè)叫
objFoo的對(duì)象變量,不用Set語句,下面的語句所設(shè)置的引用就產(chǎn)生了歧義性:
objFoo = Text1
這條語句是應(yīng)該設(shè)置到Text1的引用,還是以Text1的Text屬性來填充objFoo?你不
能確定,編譯器也不能。拋棄Set語句同時(shí)要求拋棄默認(rèn)屬性。
有一個(gè)改變我不喜歡:你不再能在不同的作用域里聲明Property Get和Property S
et過程。注意 VB.NET 沒有 Property Let 語句:對(duì)象和數(shù)值都用 Property Set。這意
味著你不能用一個(gè) Friend Property Let 過程來對(duì)應(yīng)一個(gè) Public Property Get。用V
B建立組件時(shí)可能會(huì)有麻煩。許多組件開發(fā)者創(chuàng)建 Friend Property Set 過程以使他們
的應(yīng)用程序能改變一個(gè)值,但提供 Public Property Get 過程以使他們的客戶程序能取
回值。我希望我能為這個(gè)改變找到一個(gè)合適的理由,可是我找不到。
Microsoft說它力圖使語言保持清晰并使之現(xiàn)代化—大部分情況下它做得不錯(cuò)—但這
個(gè)作用域問題和其它幾個(gè)問題令人感到困惑。例如,While...Wend 很早以前就應(yīng)該消失
了,因?yàn)?Do...Loop 完成同樣的功能。然而,Microsoft 不僅沒能去掉 While...Wend
,還把它改成了 While...End While 來給自己找了更多的麻煩。真奇怪!
我最不喜歡的改變是:Microsoft改變了你已經(jīng)使用的數(shù)據(jù)類型含義。在 .NET 里,
Integer 現(xiàn)在是 32 位,而 Long 變成了 64 位。我心存恐懼地想:開發(fā)者 (包括我自
己) 會(huì)多么頻繁地使用錯(cuò)誤的變量啊。那個(gè)API到底是接受一個(gè)16位的 Integer還是32位
的?老天!我希望Microsoft重新考慮這個(gè)決定并使用新的變量類型,比如Int32和Long
64。無論遷移到 VB.NET的移植工具是多么的好,它也不能改變開發(fā)者的記憶。為什么要
逼著我們?cè)賹W(xué)一遍普通的數(shù)據(jù)類型呢?
最后,最需要的一個(gè)改變是:VB.NET引入了 Option Strict 關(guān)鍵字,你可以使用它
來代替 Option Explicit。Option Strict 結(jié)束了萬惡的類型強(qiáng)制(tm),通過它VB樂于
讓你把一個(gè)數(shù)值賦值給一個(gè)字符串,然后像犯罪一樣做另一個(gè)操作。設(shè)置 Option Stri
ct 告訴 Visual Basic.NET 不要為你做任何類型強(qiáng)制。注意 VB.NET 并不是徹底的控制
狂,它允許類型向下轉(zhuǎn)換,但不允許向上。例如,不使用像 sngvariable = CSng(dblv
ariable) 這樣的語句進(jìn)行顯式類型轉(zhuǎn)換,你就不能把聲明為 Single 的變量賦值給聲明
為 Double 的變量。因?yàn)檫@有丟失數(shù)據(jù)的風(fēng)險(xiǎn)。然而,你能不使用顯式類型轉(zhuǎn)換就把聲
明為 Double 的變量賦值給聲明為 Single 的變量,因?yàn)檫@并沒有丟失數(shù)據(jù)的危險(xiǎn)。使
用 Option Strict 能幫助開發(fā)者減少很多類型錯(cuò)誤,包括那些很難調(diào)錯(cuò)的。但有一個(gè)附
加的缺陷:在工程里使用了 Option Strict 后,就不能進(jìn)行 后編聯(lián)了。
回復(fù):
細(xì)說VB.NET(下)
(作者:青蘋果工作室編譯 2001年03月07日 14:47)
表單和新IDE面孔
Visual Basic.NET 的面向?qū)ο蠊δ芎軅ゴ?,但第一次啟?dòng) VB.NET 時(shí)還注意不到它
??赡苣阕⒁獾降牡谝患率撬?IDE。IDE看起來可能很熟悉,建立VS.NET IDE的團(tuán)隊(duì)
以前的工作是開發(fā)VB的IDE,對(duì)IDE的增強(qiáng)借鑒了VB IDE的經(jīng)驗(yàn)。
同時(shí),IDE的改變遠(yuǎn)比外表顯示的深刻。所有.NET語言使用相同的IDE,并且IDE中的
新工具功能強(qiáng)大又易于理解。你能把任何一個(gè)設(shè)計(jì)窗口設(shè)置為自動(dòng)隱藏 (就像你能自動(dòng)
隱藏Windows任務(wù)欄那樣),這樣就大大地減少了混亂。主工作區(qū)域是一系列選項(xiàng)卡,這
意味著IDE不再同時(shí)顯式多個(gè)表單和代碼模塊。當(dāng)打開對(duì)象的源代碼時(shí),IDE在它的主工
作區(qū)域?yàn)楣ぷ鞯膶?duì)象添加一個(gè)新的選項(xiàng)卡。
IDE還包括一個(gè)叫作任務(wù)表(Task List)的新窗口。它的內(nèi)容由IDE創(chuàng)建的項(xiàng)目組成。
例如,如果在試圖編譯一個(gè)工程時(shí)收到一個(gè)錯(cuò)誤,VB在任務(wù)表里創(chuàng)建一個(gè)項(xiàng)目來解釋這
個(gè)錯(cuò)誤。你能直接向任務(wù)表里添加項(xiàng)目,或者通過在代碼里以 "TODO:"開始一個(gè)注釋行
,你可以在代碼位置和任務(wù)之間建立聯(lián)系。我喜歡Microsoft實(shí)現(xiàn)任務(wù)表的方式;在程序
出爐前,都需要完成些什么?估計(jì)它能幫我省掉很多時(shí)間和麻煩??吹剿鼤r(shí),你最容易
產(chǎn)生的一個(gè)想法就是:以前怎么就沒人想到它呢?
你能注意到的另一個(gè)變化就是:VB.NET的表單。Microsoft廢棄了舊的表單引擎而使
用Windows Form代替它。所有基于 CLR的語言都使用Windows Form引擎。相對(duì)于VB6的表
單引擎,它有幾個(gè)重要的改進(jìn)。例如,Windows Form讓你能創(chuàng)建能自動(dòng)調(diào)整組件尺寸的
表單,并允許將控件錨定在表單里的特定位置。換句話說,不再需要使用第三方控件就
能完成這些特殊任務(wù)。Windows Form還允許表演像透明表單這樣的很酷的技術(shù)。
過去,VB隱藏了建立表單的所有魔術(shù)。你使用IDE設(shè)計(jì)表單并把代碼添加到Initial
ize事件上,但你沒有手段來控制這兩點(diǎn)之間的過程。現(xiàn)在,表單就是一個(gè)類,它包含用
來建立表單所有的代碼。我把這些代碼稱為肥料代碼,因?yàn)榇蠖鄶?shù)開發(fā)者希望遠(yuǎn)遠(yuǎn)離開
它們,越遠(yuǎn)越好。要想可靠地弄壞你的程序,沒有比折騰這些代碼更好的辦法了。另一
方面,技術(shù)嫻熟的用戶可以通過這些代碼做很多很酷的事,因?yàn)樗屇隳茏叩絍B.NET表
單的幕后。要是你不想看到這些代碼你也能不看,因?yàn)樾麓a編輯器有展開和折疊代碼
區(qū)的功能,并且這些肥料代碼是默認(rèn)折疊的。代碼編輯器還有幾個(gè)很酷的新功能。例如
,現(xiàn)在它自動(dòng)為你縮排所有代碼(而且還干得不錯(cuò)),它還有內(nèi)置的顯示行號(hào)功能。
創(chuàng)建編譯的服務(wù)器端代碼
除了新的Windows Form引擎,.NET還包括一個(gè)為創(chuàng)建Web表單而特別設(shè)計(jì)的表單引擎
。這些被稱為Web Form的表單很聰明,就像VB讓你能很容易地為傳統(tǒng)Windows桌面應(yīng)用程
序創(chuàng)建表單一樣,它們讓你能方便地為Web創(chuàng)建表單。Web Form是 ASP.NET里的技術(shù),讓
你能使用熟悉的RAD工具創(chuàng)建帶有代碼的表單。創(chuàng)建的ASP.NET代碼編譯并駐留在服務(wù)器
上,并在那里被執(zhí)行,然后以HTML方式發(fā)送給任何一個(gè)支持HTML 3.2的瀏覽器。
底層結(jié)構(gòu)捕獲客戶端上的事件數(shù)據(jù),并把它發(fā)送給服務(wù)器。這意味著可以使用各種
用戶界面工具,可以利用現(xiàn)有的表單設(shè)計(jì)技巧,而且應(yīng)用程序界面是不依賴瀏覽器的。
如果可以放棄不依賴瀏覽器,你還有另一個(gè)選擇來利用Internet Explorer 某些功能特
有的優(yōu)勢(shì)。Web Form使支持Web的應(yīng)用程序能更容易地創(chuàng)建更好、更豐富多彩的用戶界面
。
Web服務(wù)策略
VB.NET里的另外一個(gè)重要的面向Web的功能是:Web服務(wù)。Microsoft的市場(chǎng)部門把W
eb服務(wù)列為采用.NET的幾大理由之一。實(shí)際上,Web服務(wù)的本質(zhì)就是使用標(biāo)準(zhǔn)協(xié)議的、由
Web服務(wù)器提供的、類似于COM的對(duì)象。注意在技術(shù)上它們并不是COM對(duì)象,但和COM對(duì)象
的表現(xiàn)方式很相像。Microsoft希望看到所有的公司使用Web服務(wù),并且未來的應(yīng)用程序
可以簡(jiǎn)單地“粘”在不同的Web服務(wù)上,就像現(xiàn)在可以使用Visual Basic for Applicat
ions (VBA)建立基于Office和支持VBA的程序的解決方案一樣。
在PDC上,對(duì)于它希望開發(fā)者如何“粘”在這些服務(wù)上,Microsoft提供的一個(gè)演示
程序給出了很好的例子。在這個(gè)演示程序里,一個(gè)假想的診所通過Web服務(wù)提供預(yù)約系統(tǒng)
,演示了你可以怎樣使用智能電話通過Web進(jìn)行預(yù)約。Visual Basic.NET 甚至?xí)试S你
查詢服務(wù)器,并獲得關(guān)于服務(wù)器能支持的所有Web服務(wù)的相關(guān)數(shù)據(jù)。通過IntelliSense
dropdown這個(gè)絕對(duì)有用的工具,程序員可以訪問Web服務(wù)。Web服務(wù)是Microsoft雄心勃勃
的戰(zhàn)略,但只有時(shí)間才能檢驗(yàn)它是否能成功地被廣泛接納。
Microsoft試圖消除與包裝和分發(fā)應(yīng)用程序相關(guān)的問題,包括令人恐懼的DLL。所有
.NET應(yīng)用程序被封裝為元件。元件包含著數(shù)據(jù)以描述它運(yùn)行所需的東西。這些數(shù)據(jù)被稱
為貨單,包括很多信息,例如:元件身份(名稱、版本等等);一個(gè)列出了所有文件之間
的依賴關(guān)系的表,以及它們的位置和版本;包括DLL相關(guān)數(shù)據(jù)的外部依賴關(guān)系信息;還有
其它元件需要而開發(fā)者沒有創(chuàng)建的資源。元件是自說明的(通過它們的貨單),所以.NET
應(yīng)用程序不需要修改注冊(cè)表才能工作。換句話說,你不再需要注冊(cè)表組件。在最好的情
況下,即客戶機(jī)里已經(jīng)有了.NET運(yùn)行庫時(shí),分發(fā)一個(gè)復(fù)雜的應(yīng)用程序可能只是把一個(gè)文
件夾復(fù)制到目標(biāo)機(jī)器上這么簡(jiǎn)單的事。元件的另一個(gè)好處是:你可以讓不同的應(yīng)用程序
使用同一個(gè)DLL的不同版本,并且協(xié)調(diào)地運(yùn)行在一臺(tái)機(jī)器上。如果所有這些都可以像計(jì)劃
中那樣工作,有關(guān)DLL的地獄和版本的噩夢(mèng)就將成為往事。
正確之路
Microsoft徹底更新了它的技術(shù),而不僅僅是核心語言。例如,在Visual Studio.N
ET里同時(shí)提供了ADO.NET,這是有特殊優(yōu)點(diǎn)的下一代ActiveX Data Objects (ADO) 版本
。它的一個(gè)靈活改變是:ADO.NET用Extensible Markup Language (XML)作為在組件之間
傳遞數(shù)據(jù)集的格式。這意味著接收組件不一定必須是ADO.NET組件,同時(shí)接收組件可以接
受任何XML 格式的數(shù)據(jù)集。談到XML,它支撐著VS.NET中的任何東西,從配置文件到遠(yuǎn)端
過程調(diào)用。ADO.NET在處理斷開的數(shù)據(jù)集時(shí)比 ADO的性能要好,并且具有更好的伸縮性。
Visual Basic.NET對(duì)我們都很熟悉的VB做了重要的改變。C++革命性地跳躍到.NET后
有了一個(gè)新名字:C#,而Visual Basic的名字沒變。然而,如果你把VB.NET當(dāng)作語法相
似的一門新語言而不是簡(jiǎn)單的“升級(jí)”,可能掌握起來就要容易一些。本文給你一個(gè)起
點(diǎn),但吸收掌握各種知識(shí),并對(duì)未來做出有根據(jù)的決定是一個(gè)艱苦的過程,它只是這個(gè)
過程的一條起跑線。我不知道.NET會(huì)有多么成功,它的很多地方吸引我,但有些地方并
非如此。這個(gè)工具做了大量承諾,它夸耀很多功能能使 VB開發(fā)者更簡(jiǎn)單地創(chuàng)建更有伸縮
性的高端應(yīng)用程序。最后,它的成功將取決于開發(fā)者能多好地將它應(yīng)用于現(xiàn)實(shí)世界。縱
觀Microsoft在PDC和Beta 1版本之間的性能和穩(wěn)定性上所跨過的這一步,我堅(jiān)定地認(rèn)為
:Microsoft走對(duì)了路!
dim yearx as integer,month1 as integer,month2 as integer,month3 as integer
monthx=month(date)
if monthx=1 or monthx=2 or monthx=3 then
yearx=year(date)-1:month1=10:month2=11:month3=12
elseif monthx=4 or monthx=5 or monthx=6 then
yearx=year(date):month1=1:month2=2:month3=3
elseif monthx=7 or monthx=8 or monthx=9 then
yearx=year(date):month1=4:month2=5:month3=6
elseif monthx=10 or monthx=11 or monthx=12 then
yearx=year(date):month1=7:month2=8:month3=9
end if
如果DateDiff(月,開始日期,結(jié)束日期)=6
在檢查開始日期的月份是不是1或者7,如果是在檢查結(jié)束日期的月份是不是6或者12,如果都滿足 就是半年
如果DateDiff(月,開始日期,結(jié)束日期)=2并且 開始日期的月份不能被2整除 就是雙月