vb.net且或非 vbs 與或非

vb和vb.net的區(qū)別和特點

1、vb.net ?完全符合面向?qū)ο蟮木幊陶Z言抽象、封裝、繼承的四大特性,而vb不支持繼承。

公司主營業(yè)務:成都網(wǎng)站設計、網(wǎng)站建設、移動網(wǎng)站開發(fā)等業(yè)務。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出撫州免費做網(wǎng)站回饋大家。

2、錯誤處理不同。

vb中只是On Error.....goto和On Errer Resume Next ,這些錯誤稱為非結(jié)構(gòu)化異常處理。而在vb.net中采用的結(jié)構(gòu)化異常處理機制,try...catch....finally控制。

3、兩者產(chǎn)生的窗體不同。

vb.net 允許創(chuàng)建不同類型的應用程序,例如,創(chuàng)建ASP.NET和ASP.NET Web 服務應用程序,還允許創(chuàng)建控制臺應用程序和作為桌面服務運行的應用程序。但是vb 只能創(chuàng)建Windows窗體。

4、數(shù)據(jù)庫訪問的差別。

vb6.0是通過ADO(Active X Data Objext)來實現(xiàn)對數(shù)據(jù)庫訪問。而vb.net 是通過ADO.NET來訪問數(shù)據(jù)庫。

擴展資料

Visual Basic(簡稱VB)是Microsoft公司開發(fā)的一種通用的基于對象的程序設計語言,為結(jié)構(gòu)化的、模塊化的、面向?qū)ο蟮?、包含協(xié)助開發(fā)環(huán)境的事件驅(qū)動為機制的可視化程序設計語言。是一種可用于微軟自家產(chǎn)品開發(fā)的語言。

“Visual” 指的是開發(fā)圖形用戶界面 (GUI) 的方法——不需編寫大量代碼去描述界面元素的外觀和位置,而只要把預先建立的對象add到屏幕上的一點即可。

“Basic”指的是 BASIC (Beginners All-Purpose Symbolic Instruction Code) 語言,是一種在計算技術(shù)發(fā)展歷史上應用得最為廣泛的語言。

Visual Basic源自于BASIC編程語言。VB擁有圖形用戶界面(GUI)和快速應用程序開發(fā)(RAD)系統(tǒng),可以輕易的使用DAO、RDO、ADO連接數(shù)據(jù)庫,或者輕松的創(chuàng)建Active?X控件,用于高效生成類型安全和面向?qū)ο蟮膽贸绦?。

參考資料:百度百科-Visual Basic

vb和vb.net的區(qū)別

VB.NET和VB6.0有什么區(qū)別

Visual Basic .NET是Microsoft Visual Studio .NET套件中主要組成部分之一。.NET版本的Visual Basic增加了更多特性,而且演化為完全面向?qū)ο螅ň拖馛++)的編程語言。本文將介紹VB.NET的新特性,并比較VB6.0/VB.NET之間的區(qū)別,闡述如何利用VB.NET編寫簡單的應用程序。

1.1 什么是 VB.NET? Microsoft推出全新的編程和操作系統(tǒng)Framework——.NET,支持多種語言利用公共.NET庫開發(fā)應用程序,這些應用程序在.NET Framework上運行。使用Visual Basic在.NET Framework上編程,這就是VB.NET。

首先,讓我演示在VB.NET中寫最簡單的控制臺程序:Hello World。

1.2 Hello, World!“Hello World!”是初學者學習Windows編程的代表性程序。我們的第一個程序就叫做“Hello VB.NET World!”。該程序在控制臺輸出一句話:“Hello VB.NET World!”,代碼如下所示:

代碼 1.1: Hello VB.NET World例子Imports System

Module Module1

Sub Main()

System.Console.WriteLine("Hello VB.NET World!")

End Sub

End Module

1.3 VB.NET 編輯器和編譯器你可以在記事本或VS.NET IDE等任意文本編輯器中撰寫上述代碼,然后保存為HelloWorld.vb。 代碼編寫完成之后,要么在命令行、要么在VS.NET IDE中編譯它。在Microsoft .NET Framework SDK中已經(jīng)包括VB.NET編譯器vbc.exe[][1],從IDE或是命令行都可以調(diào)用。要從命令行編譯HelloWorld.vb,請在命令行窗口輸入

vbc HelloWorld.vb /out:HelloWorld.exe /t:exe

編譯結(jié)束后,HelloWorld.exe被創(chuàng)建到當前目錄下。在資源管理其中雙擊圖標或在命令行執(zhí)行,程序正確地運行了。祝賀你進入VB.NET開發(fā)者的行列。

Imports 語句

如你所知,大部分的.NET類型都在名字空間(namespace)中定義。Namespace是定義和管理類別的范疇。察看.NET Framework Class Library,可以看到數(shù)以百計的namespace。例如,System namespace就包括了Console、Object等類型定義。如果想使用Console類,需要用Imports指令導入System namespace。如下所示:

Imports System甚至可以明確地調(diào)用namespace而無需用Import導入。下面的例子展示了不用Import的“Hello World!”程序:

代碼1.2: Hello VB.NET World例子Module Module1

Sub Main()

System.Console.WriteLine("Hello VB.NET World!")

End SubEnd Module1.4 解析 "Hello VB.NET World!"程序第一行是:

Imports System; System namespace定義了Console類,該類用于讀寫控制臺(命令行窗口)。然后你定義了一個module:Module Module1

…End Module所有的VB程序都包括一個Main()方法,即應用程序入口點。在例子程序中,我們調(diào)用Console.WriteLine()向控制臺寫入“Hello VB.NET World!”:

Sub Main()

Console.WriteLine(“Hello VB.NET World!”) End SubWriteLine()方法歸屬于Console類,它負責向控制臺寫一個帶有行結(jié)束符的字符串。如前所述,Console類定義于System namespace,你通過直接引用來控制類成員。

Console類負責讀寫系統(tǒng)控制臺。讀控制臺輸入用Read和ReadLine方法,向控制臺輸出用WriteLine方法。

表1.1 Console類定義的方法

方法 用途 例子

Read 讀入單個字符 int i = Console.Read();

ReadLine 讀入一行 string str = Console.ReadLine();

Write 寫一行 Console.Write("Write: 1");

WriteLine 寫一行,并帶上行結(jié)束符

Console.WriteLine("Test Output Data with Line");

1.5 VB.NET有什么新特點? VB.NET比 VB6.0更加穩(wěn)定,而且完全面向?qū)ο蟆R苍S你還記得,VB6.0不支持繼承、重載和接口,所以不是真正面向?qū)ο蟮?。而VB.NET則支持這些面向?qū)ο筇匦?。VB6.0有兩個薄弱環(huán)節(jié)——多線程和異常處理。在VB.NET中,開發(fā)多線程應用和使用C++/C#別無二致,結(jié)構(gòu)化異常處理也得到支持。稍后我們會詳細解釋這些特性。

下面是VB.NET的特性列表——

·面向?qū)ο蟮木幊陶Z言。支持繼承、重載、接口、共享成員和構(gòu)造器。·支持所有的CLS特性,如存取控制.NET類、與其它.NET語言交互、元數(shù)據(jù)、公共數(shù)據(jù)類型、委托等等?!ざ嗑€程支持?!そY(jié)構(gòu)化異常處理。 1.6 名字空間與集合 前面討論了我們的第一個VB.NET程序。該程序中首先引人注意的是名字空間(namespace)。在.NET參考文檔中,你會發(fā)現(xiàn)每個類都歸屬于某個namespace。那么,namespace到底是什么?

一個namespace是類和組件的邏輯組合,其目的在于將.NET class按類別定義。微軟借用了C++ class packaging概念:namespace來描述這種組合。.NET Framework中的組件被稱為集合(assembly)。全部.NET代碼在數(shù)百個庫文件(DLL)中定義。Namespace把assembly中定義的類組織起來。一個namespace可以包括多個assembly,一個assembly也可以在多個namespace中定義。 namespace樹的根節(jié)點是System namespace。在.NET Library中,每個class都在一組相似的類別中定義。例如,System.Data namespace只包括數(shù)據(jù)相關類。同樣,System.Multithreading只包括多線程類。

在使用.NET支持的語言(如C#、VB.NET、C++.NET等)創(chuàng)建新應用程序時,你會注意到每個應用程序都被定義為一個namespace,而所有的class都歸屬于這個namespace。通過引用這個namespace,其它應用程序就能存取這些class。 在.NET中,代碼被編譯為中間語言(Intermediate Language,IL),assembly中存儲了IL代碼、元數(shù)據(jù)和其它資源文件。同一個assembly可以附屬于一個或多個Exe/DLL。所有的.NET庫都存儲在assembly中。

1.7 VB.NET: 完全面向?qū)ο蟮木幊陶Z言抽象、封裝、多態(tài)、繼承是面向?qū)ο笳Z言的四個基本屬性。VB6.0不支持繼承,而VB.NET則不然。所以,和C++一樣,VB.NET也是完全面向?qū)ο蟮木幊陶Z言。

Class 和 ModuleVB.NET用Class...End Class語句對創(chuàng)建class。每個VB.NET至少包括一個Module(模塊)。Module在Module…End Module語句對中實現(xiàn)。應用程序的主要模塊是Main方法,亦即應用程序入口點。

和VB6.0相似的地方是,都可以使用Function/Sub關鍵字定義方法。下面的例子顯示了如何創(chuàng)建class、添加方法,并從主程序調(diào)用方法: Imports System

Module Module1

Sub Main()

Dim cls As TestClass = New TestClass

Console.WriteLine(cls.MyMethod)

End Sub

Class TestClass

Function MyMethod() As String

Return "Test Method"

End Function

End Class

End ModuleProperty屬性(Property)是類變量的公共描述。Property…End Property語句用以創(chuàng)建property。屬性的Get/Set方法分別用于取得和設置屬性值。下面的例子中,Data是TestClass的屬性。

Imports System

Imports System.Console

Module Module1

Sub Main()

Dim cls As TestClass = New TestClass

WriteLine(cls.MyMethod)

WriteLine(cls.Data)

cls.Data = "New Data"

WriteLine(cls.Data)

End Sub

End Module

Class TestClass

Private strData As String = "Some Data"

Function MyMethod() As String

Return "Test Method!"

End Function

' Adding Data property to the class

Public Property Data() As String

Get

Return strData

End Get

Set(ByVal Value As String)

strData = Value

End Set

End Property

重載VB.NET通過overload關鍵字支持方法重載。使用這個關鍵字,你可以定義同名但不同參數(shù)的方法。

類成員訪問域

除了原有的Private和Public,VB.NET引入了幾個新關鍵字。全部訪問域關鍵字列表如下:

關鍵字 作用域

Private 限于class內(nèi)部

Public 可以從class外訪問

Friend 限于class所屬的應用程序內(nèi)

Protected 只能被class和其派生類訪問

Protected Friend 能被class、應用程序和派生類訪問

繼承繼承是面向?qū)ο缶幊陶Z言中最常用的技術(shù)。繼承讓你能夠重用類代碼和功能。

VB.NET支持繼承,而VB6.0則不支持。繼承的好處在于你能使用任何人編寫的類,從這些類派生自己的類,然后在自己的類中調(diào)用父類功能。在下面的例子中,Class B派生自Class A,我們將從Class B中調(diào)用Class A的方法MethodA。

Imports System

Imports System.Console

Module Module1

Sub Main()

Dim bObj As B = New B

WriteLine(bObj.MethodA())

End Sub

End Module

' Class A defined

Public Class A

Function MethodA() As String

Return "Method A is called."

End Function

End Class

'Class B, inherited from Class A. All members (Public and Protected)

' can be access via B now.

Public Class B

Inherits A

Function MethodB() As String

Return "Method B is called."

End Function

End Class

可以從一個class中派生多個自定義class,也可以從多個class派生一個自定義class。

共享的成員類的共享成員被類的所有實體共享。共享成員可能是屬性、方法或字段/值域。在你不想讓用戶全面控制自己的類時,共享成員相當有用。例如,你可以開發(fā)一個類庫,讓用戶通過共享成員使用其中的部分功能。

可以通過class本身引用共享成員,而無需通過類的實體。例如:Module Module1

Sub Main()

WriteLine(A.MethodA())

End Sub

End Module

' Class A defined

Public Class A

Shared Function MethodA() As String

Return "Method A is called."

End Function

End Class

多線程VB語言的一大弱點就是缺乏編寫自由線程(free-threaded)程序的能力。在.NET Framework中,所有語言共享CRL(Common Runtime Library,公共運行庫),也就是說,你可以用VB.NET、C#或其它.NET語言編寫同樣的程序。

System.Threading namespace定義了線程類。我們只需要引入System.Threading namespace,即可使用線程類。

System.Threading.Thread類提供線程對象,可以使用Thread類創(chuàng)建或破壞線程。

創(chuàng)建線程使用Thread類的實體創(chuàng)建一個新線程,然后用Thread.Start方法開始執(zhí)行線程。線程構(gòu)造器接受一個參數(shù),該參數(shù)指明你要在線程中執(zhí)行的procedure。在下例中,我想在oThread1(Thread類的一個實體)的第二線程中執(zhí)行SecondThread過程:

oThread1 = New Thread(AddressOf SecondThread)

SecondThread procedure looks like below:

Public Sub SecondThread()

Dim i As Integer

For i = 1 To 10

Console.WriteLine(i.ToString())

Next

End Sub

然后,調(diào)用Thread.Start()開始線程:

oThread1.Start()

下面的代碼創(chuàng)建兩個第二線程:

Imports System

Imports System.Threading

Module Module1

Public oThread1 As Thread

Public oThread2 As Thread

Sub Main()

oThread1 = New Thread(AddressOf SecondThread)

oThread2 = New Thread(AddressOf ThirdThread)

oThread1.Start()

oThread2.Start()

End Sub

Public Sub SecondThread()

Dim i As Integer

For i = 1 To 10

Console.WriteLine(i.ToString())

Next

End Sub

Public Sub ThirdThread()

Dim i As Integer

For i = 1 To 10

Console.WriteLine("A" + i.ToString())

Next

End Sub

End Module

破壞線程 調(diào)用Abort方法來破壞(中止)一個線程。在調(diào)用Abort之前,確保用IsAlive判斷線程處于活動狀態(tài)。

If oThread1.IsAlive Then

oThread1.Abort()

End If

暫停線程可以使用Sleep方法來暫停線程執(zhí)行。Sleep方法接受一個以毫秒為單位的參數(shù),指明線程應當暫停多長時間。

下面的例子讓線程暫停1秒鐘:

oThread2.Sleep(1000)你也可以使用Suspend和Resume方法來掛起和繼續(xù)線程執(zhí)行。

設定線程優(yōu)先級Thread類的Priority屬性用于設定線程優(yōu)先級。該屬性可以設置為Normal,AboveNormal,BelowNormal,Highest和Lowest。如:

oThread2.Priority = ThreadPriority.Highest線程與Apartment使用ApartmentState屬性設置線程的apartment類型,該屬性值可以為STA,MTA或是Unknown[][2]:

oThread.ApartmentState = ApartmentState.MTAMTS意味著可以使用多線程模式,而STA則只能是單線程執(zhí)行。

Public Enum ApartmentState

{

STA = 0,

MTA = 1,

Unknown = 2,

}

1.8 結(jié)構(gòu)化異常處理異常處理也被稱之為錯誤處理。作為VB程序員,你一定對On Error Goto和On Error Resume Next這些VB6.0錯誤處理語句耳熟能詳。這種類型的錯誤處理被稱為非結(jié)構(gòu)化異常處理(Unstructured Exception Handling)。而在VB.NET中,Microsoft推出了結(jié)構(gòu)化異常處理機制。VB.NET支持類似C++的TryCatch..Finally控制。Try..Catch..Finally結(jié)構(gòu)如下: Try

' 可能導致異常的代碼

Catch

' 當異常發(fā)生時處理異常的代碼

Finally

' 清理現(xiàn)場

End Try

Try語句塊用以拋出異常。如果異常發(fā)生,在Catch語句塊中處理。Finally語句塊是可選的,在需要釋放資源時特別有用。

1.9 VB6.0與VB.NET的不同之處除了上面談到的語言進化,還有一些語法上的變化。所有這些語言和語法的變化在MSDN中均可查到,本文只作簡單介紹。

數(shù)據(jù)類型(Data Type)的改變VB.NET中有些數(shù)據(jù)類型得到改進。下面是變化對照表。

數(shù)據(jù)類型 VB6.0 VB.NET

Integer 16 bit size 32 bit size

Long 32 bit size 64 bit size

Currency 用于存儲大浮點數(shù) 被decimal替代,支持更高精度

Variant 可以存儲任意類型數(shù)據(jù) 被Object類型替代,也可以存儲任意類型數(shù)據(jù),但結(jié)果更好

Date Date類型被存儲為double 引入DateTime類型,用于存儲不同格式的日期

在VB.NET中,Short數(shù)據(jù)類型是16 bit的。Short,Integer和Long都等同于CLR的System.Int16、System.Int32和System.Int64類型。 變量聲明的變化在VB6.0中,變量聲明有許多限制。其中之一就是不能同行聲明多個變量。如果一定要在一行中聲明多個變量,就一定得指明每個變量的類型,否則將被默認為Variant類型。

Dim a1, a2 As Integer Dim a3 As Integer, a4 As Integer 第一行中的a1是Variant類型,a2是Integer類型。第二行中兩個變量都是Integer類型。VB.NET支持同行聲明多個變量,舉例如下:

Dim a1, a2, a3 As Integer 變量初始化是另一個問題。在VB6.0中不能同時聲明和初始化變量,而VB.NET則支持這個特性。

Dim name As String = "Mahesh"System.Console.Write(name) 聲明常量也可以照此辦理:Const DT_COUNT As Integer = 23 New關鍵字。在VB.NET中,New關鍵字用于創(chuàng)建對象。由于數(shù)據(jù)類型是對象,所以New關鍵字用以創(chuàng)建一個數(shù)據(jù)類型對象。

Dim i As Integer = New Integer()i = 10System.Console.WriteLine(i.ToString()) 代碼塊級別支持。像C++一樣,VB.NET支持代碼塊級別的作用域檢查。在語句塊中聲明的變量只在塊內(nèi)有效。

For i = 1 To 10Dim p As LongSystem.Console.WriteLine(i.ToString())NextSystem.Console.WriteLine(p.ToString()) 這段代碼在VB.NET中會得到一個編譯錯誤,因為p在For..Next語句塊之外不可訪問。在VB6.0中這段代碼可以通過。

改進了的類型安全

在VB6.0中,當你聲明一個對外部過程的引用時,可以指定任意類型的參數(shù)為As Any。Any關鍵字禁止了類型檢查,允許任意數(shù)據(jù)類型傳入和返回。

VB.NET不支持Any關鍵字。你必須指定每個參數(shù)和返回值的數(shù)據(jù)類型。數(shù)組VB.NET對數(shù)組作了明顯的改動。

數(shù)組范圍。在VB.NET中,你需要格外留意數(shù)組范圍問題。VB6.0默認數(shù)組下界為0,故數(shù)組中的元素數(shù)量等與數(shù)組上界值加一。下面的數(shù)組界限從A(0)到A(10),共有11個元素:

Dim A(10) As Single可以使用Option Base改變下界值為1。在VB.NET中,數(shù)組和C++一樣,下界值為0,不支持Option Base。注意:MSDN文檔指出數(shù)組只能包括與其尺寸相等的元素數(shù)量,例如:Dim A(10) As Integer 只能包括10個元素(從A(0)到A(9)),但在編譯下面這段代碼時我發(fā)現(xiàn)它運行良好,看起來數(shù)組中容納了11個元素。

Dim A(10) As Integer A(0) = 12 A(2) = 24 A(10) = 23 System.Console.WriteLine(A(0).ToString()) System.Console.WriteLine(A(10).ToString())System.Console.WriteLine(UBound(A).ToString()) System.Console.WriteLine(LBound(A).ToString()) Lbound和Ubound分別返回 0與10。ReDim和Fixed Array。你可以在VB6.0中指定固定長度的數(shù)組。

Dim ArrWeekDays(0 To 6) As Integer

這里的ArrWeekDays數(shù)組是固定長度的,不能用ReDim語句改變長度。VB.NET不支持固定長度數(shù)組,所以ReDim總是有效。

可以用下面兩種方式聲明數(shù)組: Dim ArrWeekDays(6) As IntegerDim ArrWeekDays() As Integer = {1, 2, 3, 4, 5, 6} ReDim語句。在VB6.0中,ReDim用于初始化動態(tài)數(shù)組。在VB.NET中你不能把它當作聲明用。ReDim只能用于改變數(shù)組長度,不過不能改變數(shù)組維度。

Variant對陣ObjectVB6.0中的Variant數(shù)據(jù)類型能存儲任意類型變量,VB.NET中Object具備相同能力。

算術(shù)操作符VB.NET支持類似C++的快捷方式。下面的表格顯示了常規(guī)操作與快捷操作的不同之處??旖莘绞揭部捎糜?、/、|、等操作符。

操作符 常規(guī)語法 快捷方式加法 A = A+5 A +=5 減法 A = A – 5 A -+ 5固定長度字符串

在VB6.0中,可以在聲明字符串時指定其長度。VB.NET不支持固定長度字符串。

布爾操作符VB6.0中的And、Or或是Xor語句是按位操作符。而在VB.NET中,它們是布爾操作符。執(zhí)行這些操作將返回true或false。VB.NET引入新操作符來完成按位操作。

操作符 描述 BitAnd 按位AndBitOr 按位OrBitXor 按位XorBitNot 按位Not結(jié)構(gòu)與自定義類型在VB6.0中,你使用Type…End Type語句塊創(chuàng)建結(jié)構(gòu)或自定義類型。例如:

Type StdRec

StdId As Integer

StdName As String End Type

VB.NET引入新的語法:Structure。Type…End Type不再被支持。Structure…End Structure與C++用法相同??梢灾付ńY(jié)構(gòu)中每個元素的可訪問域,如Public、Protected、Friend、Protected Friend、Private等。例如:

Structure StdRec

Public StdId As Integer Public StdName As String

Private StdInternal As String End StructureVB.NET中的Structures就像類一樣,也可以擁有方法和屬性。New和Nothing關鍵字VB6.0中,AS New和Nothing關鍵字用于聲明一個對象并初始化它。 VB.NET不支持隱式創(chuàng)建對象。如前所言,甚至連數(shù)據(jù)類型都是對象。你可以采用以下兩種方法創(chuàng)建數(shù)據(jù)類型或?qū)ο螅?Dim i As Integer Dim i As Integer = New Integer() // Do something if i = Nothing Then End If 不支持Set語句VB6.0使用Set語句指派對象。例如:Set myObj = new MyObjectSet a = b在VB.NET中,不需要使用Set指派對象。例如:myObj = new MyObj()a = b過程(procedure)語法的變化在VB.NET中過程語法有了很多變化。例如類似C++的過程調(diào)用方式、ByVal(傳值)為默認類型、Optional關鍵字、return語句等等。類似C++的過程調(diào)用方式 VB6.0允許不用加圓括號調(diào)用過程(sub)。不過,用Call語句調(diào)用函數(shù)或sub時,一定要使用圓括號。例如:Dim I as IntegerCall EvaluateData(2, i) EvaluateData 2, i 在VB.NET中,所有的方法調(diào)用都需要圓括號,而Call語句則是可選的。 ByVal是默認參數(shù)類型在VB6.0中,在調(diào)用函數(shù)或sub時ByRef(傳址)是默認類型。那意味著所有改變將反映到傳入的變量。VB.NET改變了這種方式。現(xiàn)在,默認的參數(shù)類型是ByVal(傳值)。 Optional關鍵字VB6.0使用Optional關鍵字可用來讓用戶決定傳入一個默認值,之后在調(diào)用IsMissing函數(shù)判斷參數(shù)是否有效。 而在VB.NET中,每個可選參數(shù)必須聲明其默認值,無需調(diào)用IsMissing函數(shù)。例如:Sub MyMethod(Optional ByVal i As Integer = 3)

Return語句VB.NET的Return語句與C++相似。使用Return語句把控制權(quán)從過程返還給調(diào)用者。在VB6.0中,Return語句與GoSub語句一起使用。VB.NET不再支持GoSub語句。流程控制的改變下面是VB.NET對流程控制語句的修改:1. GoSub不再受到支持。2. Call、Function和Sub語句均可用于調(diào)用過程。3. On ... GoSub和On ... GoTo語句不再受支持??梢允褂肧elect Case語句來替代。4. While ... Wend語句現(xiàn)在改為While…End While語句。不再支持Wend關鍵字。小結(jié) Visual Basic .NET是.NET版本的Visual Basic,已經(jīng)從根本發(fā)生了變化!通過本文你了解到VB6.0和VB.NET的區(qū)別是很大的,可以說根本就是兩種不同的語言,因為它們的內(nèi)核發(fā)生了變化,VB6.0是基于COM而vb.net是基于.net框架的,因為這個變化,所以在構(gòu)造類時也發(fā)生了根本性的變化。

學VB還是VB.net好?

細說VB.NET(上)

(作者:青蘋果工作室編譯 2001年03月07日 14:47)

微軟公司提出的.NET概念,正從各個方面滲入到我們的生活中。它將產(chǎn)生的作用,

誠如一位業(yè)內(nèi)名家所描述的:“請忘掉你認為你所知道的,.NET將改變一切”!既然如

此,無論是IT業(yè)內(nèi)人士、還是企業(yè)決策者,快速領會這個新概念的含義及深遠影響,

都顯得非常必要。

概要

VB正在不斷地發(fā)展中,它具備了以前VB編程人員作夢都想擁有的性能,想象一下你

將隨心所欲的利用這些性能,是不是很令人激動?然而,這個計劃于2001年第四季度上

市銷售的VB版本可能會給你帶來些小麻煩,因為要完全掌握它需要一個較長的學習周期

,而且其中包括了一些微妙的變化,你可能在使用他們的時候出現(xiàn)錯誤。

需要準備的條件:建議獲得Visual Basic.NET beta 版,這些內(nèi)容對所有VB程序員

都是有用的。

Microsoft .NET平臺的涵蓋面很廣,而且很難預測它的真正意義。我們注意到,現(xiàn)

在有很多關于.NET的不正確的理解。因此在這篇文章里,我們將把給你一個VB.NET到底

是些什么的概念,從頭到尾說一說它是什么、它能干什么以及怎樣才能充分發(fā)揮它的優(yōu)

點。我們要特別地細看一下IDE的改變、面向?qū)ο筇卣鳌⒌讓咏Y(jié)構(gòu)的改變、一些“現(xiàn)代化

”的語法以及包裝和分發(fā)方面的增強。我們將討論這些功能能為你做什么,解釋他們的

優(yōu)點與不足。由于這些改變是如此之大,而且涉及方方面面,因此希望這一篇文章能滿

足你全部的要求是不現(xiàn)實的,要了解這方面全部的知識請參閱有關文章和書籍。

Visual Basic.NET 和你現(xiàn)在所知的開發(fā)工具完全不同,并且這個新版本會改變你的

未來。到底有多大不同?如果你覺得從VB3遷移到VB4是一個很大的變化,那這次VB.NET

會讓你感到震驚。這次升級與其說是VB的一個新版本,還不如說是遷移到一個新平臺上

,你所面臨的情況就和從DOS遷移到Windows差不多。

VB獲得了繼承能力

VB.NET預期擁有的第一新功能就是繼承能力。繼承是VB開發(fā)者長期以來要求得最多

的功能。判斷一下對繼承的要求是不是像早些時候?qū)Ρ镜鼗幾g器的要求一樣將是一件

很有意思的事,后者,當Microsoft提供了一個以后,你就幾乎聽不到多少這方面的言語

了。

Visual Basic現(xiàn)在是真正的面向?qū)ο笳Z言了。過去,你可以通過使用VB的界面繼承

性創(chuàng)建偽實現(xiàn)的對象繼承,但現(xiàn)在不必這樣做了。

Visual Basic.NET 現(xiàn)在提供大量面向?qū)ο蠊δ?,包括應用程序繼承,它允許你從其

它類導出你想創(chuàng)建的類。像在其它面向?qū)ο笳Z言里一樣,你能覆蓋基類的方法和屬性,

并且能實現(xiàn)多態(tài)以創(chuàng)建健壯的、擴展性好的組件。例如,假定你從基類 Crane里繼承產(chǎn)

生了一個ForkLift類,你能使用像下面的代碼覆蓋基類里對Lift方法的默認實現(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ū)傩缘哪芰?。例如,假定你有一個組件能對不同數(shù)據(jù)類型的數(shù)

組進行排序,你不需要三個(每種數(shù)據(jù)類型一個)不同名的方法;實際上你可以重載一個

方法名:

Overloads Sub SortArray(ByRef _

aValues()As String)

...

Overloads Sub SortArray(ByRef _

aValues() As Integer)

...

Overloads Sub SortArray(ByRef _

aValues() As Object)

另一個改變是:表單現(xiàn)在是類模塊。這就是說類本身包含建立表單的所有“肥料”

的代碼。你可能想知道,為什么你不得不看到這些從前不用看的代碼,但這個改變同時

帶來強大的新功能,包括繼承這些表單的能力。Microsoft把這一技術(shù)稱為可視化繼承。

假定你的對話框有一種標準的格式,例如在表單的一側(cè)有一行按鈕,并在角上有一個標

識,那么,通過可視化繼承你能創(chuàng)建一個表單模板(類),并從這個基類里導出所需的表

單。

一切都是對象

代碼復用簡化了開發(fā)過程,像實現(xiàn)和可視化繼承這樣的功能有利于更簡單、更強大

的代碼復用。然而,代碼復用并不是到此為止。你能通過支持VB.NET的通用語言運行庫

(Common Language Runtime - CLR)繼承在其它 VS.NET 語言里定義的類。例如,你或別

人創(chuàng)建了一個 C# 類,然后就能從 VB 里繼承它。

VB.NET 的面向?qū)ο竽芰U展了語言本身的通路:一切都是對象。這意味著比在以前

的 VB 版本里,你獲得了更多的內(nèi)在功能,你將很少被迫使用 Windows API。例如,在

以前的 VB 版本里,你使用 LoadPicture 方法加載圖片并使用表單的 Line 方法(或較

快的 API) 畫線?,F(xiàn)在,你使用 System.Drawing 對象來創(chuàng)建并處理圖形。你可以使用

以下代碼在表單上顯示一幅圖片:

picshowpicture.Image = _

system.Drawing.Image.FromFile( _

"c:\test.bmp")

注意 VB.NET 的“一切都是對象”方式讓你的語句能用得更長久。

考慮以下語句,它在一個圖形對象上畫一條黃綠色的線:

objgraphics.DrawLine(system.Drawing. _

Pens.Chartreuse, 0, 0, 100, 100)

這些長長的語句也有好處:改進的功能、適應性和易用性。從前,你要實現(xiàn)先進的

功能就不得不在文檔中挖掘,經(jīng)常是不得不訴諸API?,F(xiàn)在,相關的功能集符合邏輯地包

含在對象里。這種處理方式的另外一個好處就是:類把相關的功能很好的組織了起來。

所以,瀏覽你感興趣的對象,發(fā)現(xiàn)它們做些什么實際上很有意思。

Visual Basic.NET 的面向?qū)ο蠊δ芴峁┝撕芏鄬嵲诘暮锰?。很多情況下,VB.NET

面向?qū)ο蟮谋举|(zhì)和實現(xiàn)的繼承性能幫助你比在以前的 VB 版本里更容易、更迅速地創(chuàng)建

特定類型的功能。然而,你不一定要僅僅因為你能做到,就使用實現(xiàn)繼承性或其它 .NE

T 功能。VB.NET 的新功能使開發(fā)許多類型的應用程序變得更簡單!但是,就像使用所有

的語言能力一樣,你需要使用的是在特定場合下最適合的功能。

自由線程的危險

對于自由線程可能需要特別給出警告。VB6允許你使用獨立的線程來創(chuàng)建多線程服務

器程序,但VB過去從來沒有讓你能創(chuàng)建自由線程的客戶端程序。VB.NET 改變了這一切。

現(xiàn)在,創(chuàng)建自由線程應用程序幾乎成了最微不足道的事情。實際上,我估計那些沒有理

解其中的微妙差別,就在他們的應用程序里添加了自由線程的程序員會遇到很多問題。

只需要幾行代碼就能啟動一個新線程:簡單地將線索對象的地址傳遞給方法,方法本身

就會啟動線程。這確實是很酷也很有用的東西,但你需要小心:這些功能適用于特定的

場合,確定哪些是適用的場合并且明智的使用這些工具則是你自己的事。許多開發(fā)者使

用繼承性和自由線程時給自己找了不少麻煩,請不要讓這些發(fā)生在你身上。

可能大家討論得最多的 VB.NET 特征就是 CLR (通用語言運行庫),VB 運行在它的

頂層上。是 CLR 提供了 VB.NET 的許多關鍵功能。例如,CLR 使實現(xiàn)和跨語言繼承性以

及自由線程成為可能。

分發(fā)VB程序要求你同時分發(fā)VB的運行庫,在VB6里即是msvbvm60.dll。許多其它語言

也有類似的要求,包括 C++ 和 Java。在Visual Studio.NET里,所有的Visual Studio

語言共享同一個運行庫:CLR。這里有幾個較大的變化,首先,所有的Visual Studio語

言現(xiàn)在都共享同一個IDE、同樣的表單引擎、同樣的異常處理機制等等。這意味著Visua

l Basic和像 C#這樣的語言擁有同等的地位,至少差不多是同等的。

回復:

細說VB.NET(中)

(作者:青蘋果工作室編譯 2001年03月07日 14:47)

易于反編譯的中間語言

無論你用VB、C#或其它.NET語言編寫應用程序,VS.NET代碼都編譯成為中間語言(I

L)。當應用程序運行時,一個即時編譯器(JITter)處理IL代碼并把它編譯成為機器語言

。這意味著在理論上可能為Windows以外的平臺創(chuàng)建.NET運行庫,但現(xiàn)在關于類似的事情

還沒有任何官方消息。中間語言的一個缺陷是:它像VB5以前的VB版本一樣,容易被反編

譯。這種可能性使許多開發(fā)者普遍地質(zhì)疑.NET架構(gòu)的安全性。

CLR在IL層次內(nèi)外影響代碼,對它的修改將使所有使用CLR的語言受益。然而,語言

只是和代碼如何被解釋為IL有關,對特定語言的優(yōu)化可以根據(jù)特定語言的語法來編寫,

這樣在技術(shù)上就可能使.NET語言之間的性能差別很小。不管怎樣,大體上藍圖是美好的

。例如,CLR使VB的調(diào)試和監(jiān)測工具和C#的相應工具相當,它做到了這一點因為它們本來

就是相同的工具。

CLR提供不平行的跨語言集成,包括跨語言繼承代碼的能力。所有使用CLR的語言共

享一個通用類型系統(tǒng),它使使用多種語言開發(fā)應用程序變得更簡單。我不喜歡把 C API

聲明翻譯成VB里可以使用的形式,所以我很贊賞通用類型系統(tǒng)帶來的好處。

在CLR中運行的代碼被稱為被管理代碼,被管理代碼使用的內(nèi)存完全由CLR來控制。

被管理代碼帶來很多好處,包括跨語言集成、跨語言異常處理和簡化的部件相互作用模

型。Visual Basic被限制為只能以被管理代碼的方式工作,然而C#擁有跳到非被管理代

碼的能力(執(zhí)行到運行庫之外),并能做像指針操作這類事情。這是VB和C#不同等的情況

之一。這種能力到底有多重要取決于你想干什么。

CLR造成的體系結(jié)構(gòu)差別要比跨語言集成、共享功能和被管理代碼等深刻。首先,V

isual Studio.NET的支撐結(jié)構(gòu)不是 COM。另外,VB.NET里的所有東西,甚至字符串都是

對象。因為這些和其它一些原因,Microsoft改變了支撐結(jié)構(gòu)處理對象的方式。COM實現(xiàn)

了一個引用計數(shù)方案,這樣每次引用一個對象時,計數(shù)器遞增。當一個對象引用超出作

用域或被釋放時,計數(shù)器遞減,當引用計數(shù)減少到零時就終止這個對象。Microsoft聲稱

在.NET架構(gòu)下引用計數(shù)的開銷太大,以至于不能在 .NET中實現(xiàn)它,所以它放棄了引用計

數(shù)轉(zhuǎn)而使用垃圾收集。

垃圾收集需要新體系結(jié)構(gòu)

CLR垃圾收集器主要是監(jiān)視一個程序的資源,當可用資源達到確定的閾值時尋找無用

的對象,并在發(fā)現(xiàn)它們的時候清除這些對象。垃圾收集的一大好處就是你不再需要擔心

大多數(shù)普通的循環(huán)引用,即子對象引用了父對象,然后父對象又引用了子對象。在引用

計數(shù)方案下,循環(huán)引用使兩個對象都不能被釋放和清除。然而,垃圾收集器會發(fā)現(xiàn)循環(huán)

引用并清除它們。這也意味著釋放對象的最后一個引用時不再需要立即清除對象。

垃圾收集的一個后果是:你再也不能指望一個類的 Terminate 事件能在適當?shù)臅r機

發(fā)出。實際上,如果線程被阻塞,可能根本就不會發(fā)出 Terminate 事件。和COM提供的

確定化終止相反,它被稱為不確定的終止。缺乏確定化終止,以及因為垃圾收集器重新

安排并壓縮內(nèi)存從而不能使用指針的事實,在新聞組里激發(fā)了一波激烈的辯論。我想這

些新限制可能會令你痛恨,因為你要依靠確定化終止;也可能你漠不關心,因為你不依

賴 Terminate 事件。垃圾收集并不是萬靈藥,實現(xiàn)弱引用依然需要做一些考慮。

從引用計數(shù)到垃圾收集只是 Visual Studio.NET 的支撐結(jié)構(gòu)不是 COM 這個事實的

表象之一。你能在VB.NET中使用COM對象,比如說ActiveX服務器或ActiveX控件。然而,

你必須通過包裝訪問這些對象。任何時候聽到“包裝”這個術(shù)語,你應該明白你面對著

性能損失,并且對象的行為可能有所不同。如果當計劃移植一個使用了大量COM對象的工

程,就需要認真地測試和計劃,可能需要重新規(guī)劃應用程序的結(jié)構(gòu)才能移植成功。坦率

地說,你要有遭受挫折的準備。還記得從VBX遷移到 OCX的過程嗎?我記得,我的精神病

醫(yī)生也記得。我很快就要再去看他了 ;-)

語言本身的變化要遠遠超過體系結(jié)構(gòu)的變化。大部分改變確有道理,但我并不認為

所有的改變都是如此。以前版本的VB允許你以很多方法來做很多事,以至于統(tǒng)一的編碼

標準要么不存在要么就很難強加于人。Microsoft對VB做了大量的改變?yōu)榈木褪恰扒逦?/p>

這種語言。很多情況下,原來你有好幾種方法做一件事,現(xiàn)在就只有一種了。Billy Ho

llis 提供了語法變化的詳細列表,包括廢棄的關鍵字列表,但有些東西需要在這里重復

一下。

首先,向過程參數(shù)傳遞數(shù)據(jù)的默認方法由引用(ByRef)變成了傳值(ByVal)。這個改

變主要是因為引用要比傳值的風險大得多。它的風險主要是調(diào)用過程中的數(shù)據(jù)可能被無

意中篡改。你仍然能通過引用傳遞數(shù)據(jù),但這一改變使你需要修改新的默認調(diào)用方法來

使用引用。

Set語句消失了

其次,Set 語句消失了。在 VB.NET 里如果你需要向變量傳遞一個對象引用,所需

要的只是一個等號,對象被視為同其它值一樣。這很酷,但也有副作用:默認屬性消失

了。例如,你不再能用這種方式引用一個屬性:

Text1 = "What, me worry?"

作為替代,你必須顯式地引用屬性:

Text1.Text = "What, me worry?"

也許一眼看來不需要這種改變,但確實必須去掉默認屬性。例如,假定你有一個叫

objFoo的對象變量,不用Set語句,下面的語句所設置的引用就產(chǎn)生了歧義性:

objFoo = Text1

這條語句是應該設置到Text1的引用,還是以Text1的Text屬性來填充objFoo?你不

能確定,編譯器也不能。拋棄Set語句同時要求拋棄默認屬性。

有一個改變我不喜歡:你不再能在不同的作用域里聲明Property Get和Property S

et過程。注意 VB.NET 沒有 Property Let 語句:對象和數(shù)值都用 Property Set。這意

味著你不能用一個 Friend Property Let 過程來對應一個 Public Property Get。用V

B建立組件時可能會有麻煩。許多組件開發(fā)者創(chuàng)建 Friend Property Set 過程以使他們

的應用程序能改變一個值,但提供 Public Property Get 過程以使他們的客戶程序能取

回值。我希望我能為這個改變找到一個合適的理由,可是我找不到。

Microsoft說它力圖使語言保持清晰并使之現(xiàn)代化—大部分情況下它做得不錯—但這

個作用域問題和其它幾個問題令人感到困惑。例如,While...Wend 很早以前就應該消失

了,因為 Do...Loop 完成同樣的功能。然而,Microsoft 不僅沒能去掉 While...Wend

,還把它改成了 While...End While 來給自己找了更多的麻煩。真奇怪!

我最不喜歡的改變是:Microsoft改變了你已經(jīng)使用的數(shù)據(jù)類型含義。在 .NET 里,

Integer 現(xiàn)在是 32 位,而 Long 變成了 64 位。我心存恐懼地想:開發(fā)者 (包括我自

己) 會多么頻繁地使用錯誤的變量啊。那個API到底是接受一個16位的 Integer還是32位

的?老天!我希望Microsoft重新考慮這個決定并使用新的變量類型,比如Int32和Long

64。無論遷移到 VB.NET的移植工具是多么的好,它也不能改變開發(fā)者的記憶。為什么要

逼著我們再學一遍普通的數(shù)據(jù)類型呢?

最后,最需要的一個改變是:VB.NET引入了 Option Strict 關鍵字,你可以使用它

來代替 Option Explicit。Option Strict 結(jié)束了萬惡的類型強制(tm),通過它VB樂于

讓你把一個數(shù)值賦值給一個字符串,然后像犯罪一樣做另一個操作。設置 Option Stri

ct 告訴 Visual Basic.NET 不要為你做任何類型強制。注意 VB.NET 并不是徹底的控制

狂,它允許類型向下轉(zhuǎn)換,但不允許向上。例如,不使用像 sngvariable = CSng(dblv

ariable) 這樣的語句進行顯式類型轉(zhuǎn)換,你就不能把聲明為 Single 的變量賦值給聲明

為 Double 的變量。因為這有丟失數(shù)據(jù)的風險。然而,你能不使用顯式類型轉(zhuǎn)換就把聲

明為 Double 的變量賦值給聲明為 Single 的變量,因為這并沒有丟失數(shù)據(jù)的危險。使

用 Option Strict 能幫助開發(fā)者減少很多類型錯誤,包括那些很難調(diào)錯的。但有一個附

加的缺陷:在工程里使用了 Option Strict 后,就不能進行 后編聯(lián)了。

回復:

細說VB.NET(下)

(作者:青蘋果工作室編譯 2001年03月07日 14:47)

表單和新IDE面孔

Visual Basic.NET 的面向?qū)ο蠊δ芎軅ゴ?,但第一次啟?VB.NET 時還注意不到它

。可能你注意到的第一件事是它的 IDE。IDE看起來可能很熟悉,建立VS.NET IDE的團隊

以前的工作是開發(fā)VB的IDE,對IDE的增強借鑒了VB IDE的經(jīng)驗。

同時,IDE的改變遠比外表顯示的深刻。所有.NET語言使用相同的IDE,并且IDE中的

新工具功能強大又易于理解。你能把任何一個設計窗口設置為自動隱藏 (就像你能自動

隱藏Windows任務欄那樣),這樣就大大地減少了混亂。主工作區(qū)域是一系列選項卡,這

意味著IDE不再同時顯式多個表單和代碼模塊。當打開對象的源代碼時,IDE在它的主工

作區(qū)域為工作的對象添加一個新的選項卡。

IDE還包括一個叫作任務表(Task List)的新窗口。它的內(nèi)容由IDE創(chuàng)建的項目組成。

例如,如果在試圖編譯一個工程時收到一個錯誤,VB在任務表里創(chuàng)建一個項目來解釋這

個錯誤。你能直接向任務表里添加項目,或者通過在代碼里以 "TODO:"開始一個注釋行

,你可以在代碼位置和任務之間建立聯(lián)系。我喜歡Microsoft實現(xiàn)任務表的方式;在程序

出爐前,都需要完成些什么?估計它能幫我省掉很多時間和麻煩??吹剿鼤r,你最容易

產(chǎn)生的一個想法就是:以前怎么就沒人想到它呢?

你能注意到的另一個變化就是:VB.NET的表單。Microsoft廢棄了舊的表單引擎而使

用Windows Form代替它。所有基于 CLR的語言都使用Windows Form引擎。相對于VB6的表

單引擎,它有幾個重要的改進。例如,Windows Form讓你能創(chuàng)建能自動調(diào)整組件尺寸的

表單,并允許將控件錨定在表單里的特定位置。換句話說,不再需要使用第三方控件就

能完成這些特殊任務。Windows Form還允許表演像透明表單這樣的很酷的技術(shù)。

過去,VB隱藏了建立表單的所有魔術(shù)。你使用IDE設計表單并把代碼添加到Initial

ize事件上,但你沒有手段來控制這兩點之間的過程?,F(xiàn)在,表單就是一個類,它包含用

來建立表單所有的代碼。我把這些代碼稱為肥料代碼,因為大多數(shù)開發(fā)者希望遠遠離開

它們,越遠越好。要想可靠地弄壞你的程序,沒有比折騰這些代碼更好的辦法了。另一

方面,技術(shù)嫻熟的用戶可以通過這些代碼做很多很酷的事,因為它讓你能走到VB.NET表

單的幕后。要是你不想看到這些代碼你也能不看,因為新代碼編輯器有展開和折疊代碼

區(qū)的功能,并且這些肥料代碼是默認折疊的。代碼編輯器還有幾個很酷的新功能。例如

,現(xiàn)在它自動為你縮排所有代碼(而且還干得不錯),它還有內(nèi)置的顯示行號功能。

創(chuàng)建編譯的服務器端代碼

除了新的Windows Form引擎,.NET還包括一個為創(chuàng)建Web表單而特別設計的表單引擎

。這些被稱為Web Form的表單很聰明,就像VB讓你能很容易地為傳統(tǒng)Windows桌面應用程

序創(chuàng)建表單一樣,它們讓你能方便地為Web創(chuàng)建表單。Web Form是 ASP.NET里的技術(shù),讓

你能使用熟悉的RAD工具創(chuàng)建帶有代碼的表單。創(chuàng)建的ASP.NET代碼編譯并駐留在服務器

上,并在那里被執(zhí)行,然后以HTML方式發(fā)送給任何一個支持HTML 3.2的瀏覽器。

底層結(jié)構(gòu)捕獲客戶端上的事件數(shù)據(jù),并把它發(fā)送給服務器。這意味著可以使用各種

用戶界面工具,可以利用現(xiàn)有的表單設計技巧,而且應用程序界面是不依賴瀏覽器的。

如果可以放棄不依賴瀏覽器,你還有另一個選擇來利用Internet Explorer 某些功能特

有的優(yōu)勢。Web Form使支持Web的應用程序能更容易地創(chuàng)建更好、更豐富多彩的用戶界面

。

Web服務策略

VB.NET里的另外一個重要的面向Web的功能是:Web服務。Microsoft的市場部門把W

eb服務列為采用.NET的幾大理由之一。實際上,Web服務的本質(zhì)就是使用標準協(xié)議的、由

Web服務器提供的、類似于COM的對象。注意在技術(shù)上它們并不是COM對象,但和COM對象

的表現(xiàn)方式很相像。Microsoft希望看到所有的公司使用Web服務,并且未來的應用程序

可以簡單地“粘”在不同的Web服務上,就像現(xiàn)在可以使用Visual Basic for Applicat

ions (VBA)建立基于Office和支持VBA的程序的解決方案一樣。

在PDC上,對于它希望開發(fā)者如何“粘”在這些服務上,Microsoft提供的一個演示

程序給出了很好的例子。在這個演示程序里,一個假想的診所通過Web服務提供預約系統(tǒng)

,演示了你可以怎樣使用智能電話通過Web進行預約。Visual Basic.NET 甚至會允許你

查詢服務器,并獲得關于服務器能支持的所有Web服務的相關數(shù)據(jù)。通過IntelliSense

dropdown這個絕對有用的工具,程序員可以訪問Web服務。Web服務是Microsoft雄心勃勃

的戰(zhàn)略,但只有時間才能檢驗它是否能成功地被廣泛接納。

Microsoft試圖消除與包裝和分發(fā)應用程序相關的問題,包括令人恐懼的DLL。所有

.NET應用程序被封裝為元件。元件包含著數(shù)據(jù)以描述它運行所需的東西。這些數(shù)據(jù)被稱

為貨單,包括很多信息,例如:元件身份(名稱、版本等等);一個列出了所有文件之間

的依賴關系的表,以及它們的位置和版本;包括DLL相關數(shù)據(jù)的外部依賴關系信息;還有

其它元件需要而開發(fā)者沒有創(chuàng)建的資源。元件是自說明的(通過它們的貨單),所以.NET

應用程序不需要修改注冊表才能工作。換句話說,你不再需要注冊表組件。在最好的情

況下,即客戶機里已經(jīng)有了.NET運行庫時,分發(fā)一個復雜的應用程序可能只是把一個文

件夾復制到目標機器上這么簡單的事。元件的另一個好處是:你可以讓不同的應用程序

使用同一個DLL的不同版本,并且協(xié)調(diào)地運行在一臺機器上。如果所有這些都可以像計劃

中那樣工作,有關DLL的地獄和版本的噩夢就將成為往事。

正確之路

Microsoft徹底更新了它的技術(shù),而不僅僅是核心語言。例如,在Visual Studio.N

ET里同時提供了ADO.NET,這是有特殊優(yōu)點的下一代ActiveX Data Objects (ADO) 版本

。它的一個靈活改變是:ADO.NET用Extensible Markup Language (XML)作為在組件之間

傳遞數(shù)據(jù)集的格式。這意味著接收組件不一定必須是ADO.NET組件,同時接收組件可以接

受任何XML 格式的數(shù)據(jù)集。談到XML,它支撐著VS.NET中的任何東西,從配置文件到遠端

過程調(diào)用。ADO.NET在處理斷開的數(shù)據(jù)集時比 ADO的性能要好,并且具有更好的伸縮性。

Visual Basic.NET對我們都很熟悉的VB做了重要的改變。C++革命性地跳躍到.NET后

有了一個新名字:C#,而Visual Basic的名字沒變。然而,如果你把VB.NET當作語法相

似的一門新語言而不是簡單的“升級”,可能掌握起來就要容易一些。本文給你一個起

點,但吸收掌握各種知識,并對未來做出有根據(jù)的決定是一個艱苦的過程,它只是這個

過程的一條起跑線。我不知道.NET會有多么成功,它的很多地方吸引我,但有些地方并

非如此。這個工具做了大量承諾,它夸耀很多功能能使 VB開發(fā)者更簡單地創(chuàng)建更有伸縮

性的高端應用程序。最后,它的成功將取決于開發(fā)者能多好地將它應用于現(xiàn)實世界??v

觀Microsoft在PDC和Beta 1版本之間的性能和穩(wěn)定性上所跨過的這一步,我堅定地認為

:Microsoft走對了路!

VB.NET中的動態(tài)代碼生成技巧

本文的討論也將著眼于這兩種情況 首先是當程序員需要動態(tài)建立一個控件并將代碼附著于控件之上時 例如 你或許想創(chuàng)建一個鏈接列表 但是不知道需要創(chuàng)建鏈接的數(shù)量或是鏈接中會出現(xiàn)什么樣的數(shù)據(jù) 第二種是當程序員需要定義代碼以反映出特殊需求的時候 例如 你或許要執(zhí)行能反映用戶系統(tǒng)配置的代碼

類似上述的情況當然不會每天都上演 事實上 它們只在非常情況下才出現(xiàn) 然而 作為程序員 仍然要意識到 NET為解決動態(tài)情形提供了方案 有了正確的技巧 你就可以寫出能靈活處理動態(tài)情況的應用程序了

使用動態(tài)控件

許多程序員總會遇到需要動態(tài)創(chuàng)建控件的時候 我們所展示的例子中程序員向FlowLayoutPanel中添加了LinkLabels 或許你可以個這樣的設置來記錄和保存常用的URL 文件 網(wǎng)絡地址或是其他資源所在位置的數(shù)值 這一示例沒有真正保存鏈接 但是你可以使用XML序列化功能來實現(xiàn)保存

每次當用戶點擊Test按鈕時 示例代碼就會動態(tài)創(chuàng)建一個新的LinkLabel控件 真正的演示代碼并不復雜 例一就展示了創(chuàng)建這類控件以及將控件放入FlowLayoutPanel lstLabel中通常所需要做的一切

例一 向FlowLayoutPanel中添加新的鏈接 ?Private Sub btnTest_Click() Handles btnTest Click   Create a link  Dim NewLink As LinkLabel =New LinkLabel()   Add some properties to it  NewLink Text = DateTime Now  ToLongTimeString()   Set the click event handler  AddHandler NewLink Click  AddressOf NewLink_Click   Place the button on the form  lstLinks Controls Add(NewLink) End Sub

如你所料 該代碼開始的時候創(chuàng)建了一個新的LinkLabel并為其賦予了一些值 這一示例使用的是當前時間 你的代碼或許能夠?qū)δ骋徽鎸嵸Y源進行訪問

請注意該代碼也向鏈接的Click事件中指定了一個處理程序 你必須使用示例中的AddHandler技巧 因為普通的Handles關鍵詞路徑不起作用 一方面 設計應用程序的時候你并不清楚控件的名稱 即便你為控件指定了一個名稱 你也不知道用戶要創(chuàng)建的控件數(shù)量 所以我們沒有辦法清楚會有多少處理程序會被創(chuàng)建 處理程序的代碼與控件代碼類似 因此沒有必要創(chuàng)建多個處理程序 用于這個示例的處理代碼見例二 例二 處理動態(tài)控件點擊事件 ?Private Sub NewLink_Click( _ ByVal sender As System Object  ByVal e As System EventArgs)  Verify that you actually have a LinkLabelIf Not sender GetType() Is GetType(LinkLabel) ThenMessageBox Show( Wrong control type provided! )ReturnEnd If  Convert the input sender to a Button Dim ThisLink As LinkLabel = sender   Show that we have the correct button MessageBox Show( You created this link at:   + ThisLink Text)End Sub 

你可能已經(jīng)注意到例一中的事件處理器使用的是寬松代表——它沒有將ByVal發(fā)送器作為System Object 也沒有將ByVal e作為System EventArgs作為參數(shù)因為它不需要這二者 然而 當你創(chuàng)建一個事件處理器來動態(tài)創(chuàng)建控件時 通常你需要將ByVal發(fā)送器作為System Object參數(shù) 這意味著將這兩者都包含其中

有些程序員在創(chuàng)建事件處理器的時候會出現(xiàn)一個錯誤 即沒有檢查傳入控件的類型 發(fā)送器對象可能包含多選擇 而如果未對事件處理器進行事件處理類型的設置 那么你就會面臨更多的選擇 我們的示例代碼一開始就檢查了傳入控件對象的類型 這樣以來發(fā)送器就不會像下面所展示的代碼一樣 ?Private Sub btnTest _Click() Handles btnTest Click   Create a link Dim NewButton As Button = New Button()  Add some properties to it NewButton Text = DateTime Now ToLongTimeString()  Set the click event handler AddHandler NewButton Click  AddressOf NewLink_Click  Place the button on the form lstLinks Controls Add(NewButton)End Sub 

此代碼在FlowLayoutPanel中創(chuàng)建了一個按鈕 大多數(shù)情況下這都能正常運行 除非事件處理器不按照按鈕所示的進行操作 如果你打算服務多個控件類型 那么每個控件類型都需要一個獨特的處理 你可以使用多事件處理器或者為某些類型提供選擇標準

NewLink_Click()事件處理器照常將傳入發(fā)送器轉(zhuǎn)換成指定類型 在這個示例中則是LinkLabel 該代碼可以訪問LinkLabel屬性并能用其他方式進行互動 在我們的示例中 只顯示了一個能在創(chuàng)建鏈接的時候告知我們的對話框

使用動態(tài)代碼

在運行時創(chuàng)建一個控件是在無法確定應用程序功能的時候采取的一種策略 但是動態(tài)創(chuàng)建控件并不適用于所有的情況 有些時候你必須建立可執(zhí)行代碼 雖然你的應用程序運行的目的是補償不同極其之間的配置 不同用戶的需求 不同的環(huán)境需求或是其他要求 當應用程序所運行的電腦不存在控件 那么通常是需要創(chuàng)建動態(tài)代碼的

幸運的是 NET為我們提供了一系列動態(tài)代碼選項 例如 你可以創(chuàng)建一個可執(zhí)行的能獨立運行的程序或是可以想運行中的程序加載一個DLL然后再執(zhí)行 當你需要演示一個外部任務的時候可以使用選擇可執(zhí)行 如運行一種腳本——該DLL選項最適合擴大現(xiàn)有的應用程序功能

你可以運行來自文件或內(nèi)存的動態(tài)代碼 當你需要不止一次地運行代碼時 可以使用文件 對代碼的檢查可以再次運行外部文件而不需要對其進行二次編譯 當你需要多次演示任務的時候 如一個安裝請求 那可以使用內(nèi)存圖像

當然我們也可以更改源代碼 例如 你可以使用字符串來建立需要在應用程序中直接使用的代碼 如果你需要代碼具有高度靈活性 且代碼本身不是很長時 這一方法的優(yōu)勢就非常顯著 也可以從文件里建立代碼 就如同VS一樣 這一方法最適用于相對穩(wěn)定且不需要復雜編碼的需求 第三種選擇是使用Documentation Object Model來創(chuàng)建代碼并將其作為CodeDom樹型結(jié)構(gòu)的一個系列 該樹型結(jié)構(gòu)包括了CodeCormpileUnits 這就像是用DOM模式創(chuàng)建了一個XML文件

使用動態(tài)創(chuàng)建代碼的最好方式是用示例來檢查一下 例三展示了一個基本 Hello World 示例 該示例用源代碼直接創(chuàng)建了代碼因此你可以看到整個運行以及生成一個外部可執(zhí)行文件的過程

例三 動態(tài)編碼示例 ?Private Sub btnTest _Click() Handles btnTest Click   Create a piler Dim Comp As VBCodeProvider = New VBCodeProvider()  Define the parameters for the code you want to pile Dim Parms As CompilerParameters = New CompilerParameters)   We do want to create an executable  rather than a DLL Parms GenerateExecutable = True   The piler will create an output assembly called Output Parms OutputAssembly =  Output    The piler won t treat warnings as errors Parms TreatWarningsAsErrors = False   Add any assembly you want to reference Parms ReferencedAssemblies Add( System Windows Forms dll )   Define the code you want to run  Dim SampleCode As StringBuilder = New StringBuilder() SampleCode Append( Imports System Windows Forms  + vbCrLf) SampleCode Append( Module TestAssembly  + vbCrLf) SampleCode Append( Sub Main()  + vbCrLf) SampleCode Append( MessageBox Show(  + Chr( ) + _ Dynamically Created Code!  + _Chr( ) +  )  + vbCrLf)SampleCode Append( End Sub  + vbCrLf)SampleCode Append( End Module  + vbCrLf)  Define the code to run Dim Executable As CompilerResults = _ Comp CompileAssemblyFromSource(Parms  SampleCode ToString())  Display error messages if there are any If Executable Errors HasErrors ThenFor Each Item As CompilerError In Executable ErrorsMessageBox Show(Item ErrorText)NextElse  If there aren t any error messages  start the  executable Process Start( Output )End IfEnd Sub 

一開始你創(chuàng)建了一個使用VBCodeProvider的編譯器Comp 舊一點的 NET版本使用的是不同的方法但是這里所講的是微軟推薦的一個新方法

為了使用編譯器 你必須創(chuàng)建能描述應用程序的參數(shù) 這些參數(shù)類似于VS中你創(chuàng)建的參數(shù) 只是現(xiàn)在你可以對它們進行定義 該代碼一開始就將GenerateExecutable設置為True 這意味著你需要的是一個EXE文件而不是DLL

Parms OutputAssembly屬性包含了輸出文件的名稱 你只需要在想創(chuàng)建文件時提供這一信息即可 而不需要生成可執(zhí)行內(nèi)存了 如果你ixiang生成可執(zhí)行文件的內(nèi)存版本 可以將Parm GenerateInMemory屬性設置為True

使用Parm TreatWarningsAsErrors屬性來確定如何處理警告信息 默認的設置會使其為錯誤 這意味著你的應用程序可能無法對其進行編譯 大多數(shù)程序員使用默認設置 盡管他們開發(fā)了程序 但是在開發(fā)完成的程序中卻將其設置為False

大多數(shù)應用程序需要外部DLL以正常運行 當然 你不能創(chuàng)建任意的沒有引用外部DLL的Windows表單程序 通常 你要使用Reference文件夾來完成這一任務 不過 當你動態(tài)創(chuàng)建代碼的時候可以依賴于Parms ReferencedAssemblies屬性 如下所示 只需添加你要的DLL即可

現(xiàn)在 你已經(jīng)定義了項目 接下來需要為其創(chuàng)建源代碼 如前文所述 你可以依賴于一個外部文件或DOM模式 然后 該示例創(chuàng)建了代碼因此你可以看到整個過程 下面是代碼的原始形式 ?Imports System Windows Forms Module TestAssemblySub Main()MessageBox Show( Dynamically Created Code! )End SubEnd Module 

這個簡單的例子顯示了一個對話框 注意vbCrLf的使用 如果你不使用這一方法 那編譯器會發(fā)送給你一個錯誤信息 vbCrLf條目在該代碼中所起的作用與在程序代碼中的作用相同 只是添加的方式不一樣

從這一點老說 你最后會用Comp CompileAsseblyFromSource()方法編譯代碼 當使用DOM模式和文件的時候可以使用這一方法 而在所有三種情況中 編譯器用參數(shù)和源代碼創(chuàng)建了你請求的輸出 該運算的輸出出現(xiàn)在Executable中 是CompilerResults類型

編譯的失敗次數(shù)多于程序員的預計 無論你是在哪里使用動態(tài)編碼技巧 你必須假設會出現(xiàn)失敗的情況以及處理失敗的方案 在本例中 代碼尋找的是錯誤并在編譯失敗時將其展示在了信息框中 否則 代碼會依賴于Process Start()方法來啟用可執(zhí)行文件

底線

動態(tài)編碼技巧并不是萬能鑰匙 當你為開發(fā)問題找到了好的靜態(tài)解決方案時 當然也可以使用 但是在我們所列出的情況中沒有可行的靜態(tài)方案 因此要選擇動態(tài)編碼技巧 大多數(shù)情況下 要用動態(tài)編碼技巧解決以下問題

◆ 用戶的環(huán)境會以不可預見的方式更改時

◆ 無法控制用戶電腦的安裝

◆ 用戶或應用程序都添加了你要用控件執(zhí)行的數(shù)據(jù)要素

◆ 應用程序必須執(zhí)行很早以前的安裝任務 且這些任務與電腦 環(huán)境 網(wǎng)絡或其他不確定因素聯(lián)系緊密時

◆ 應用程序要執(zhí)行了處理級別的任務 且這些任務取決于機器連接或其他狀況

lishixinzhi/Article/program/ASP/201311/21812

網(wǎng)站題目:vb.net且或非 vbs 與或非
網(wǎng)頁地址:http://muchs.cn/article48/hjdihp.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、全網(wǎng)營銷推廣關鍵詞優(yōu)化、面包屑導航、云服務器、網(wǎng)站收錄

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化