Visual Basic .NET

Visual Basic .NET是.NET框架和後來的.NET下的一種多重程式設計正規化高階語言。VB.NET，是微軟公司於2002年作為原有的Visual Basic的繼承者而推出。雖然自2005年起，語言名稱中的“.NET”就已經被去掉了。但為了與VB 6.0及以前版本的Visual Basic進行區分，“Visual Basic .NET”的名字仍然被社會公眾用來指代VB 7.0及以後的Visual Basic。VB.NET與C#同為.Net Framework框架下兩種主要的程式設計語言，都是為了呼叫.Net Framework的類庫資源，因此兩種語言具有很高的對應性，資料型別、控制結構與語言特性都存在一一對應，容易把原始碼從一種語言對譯為另一種語言。微軟公司的整合開發環境Visual Studio是最為廣泛使用的VB.NET開發工具。然而Visual Studio的大部分版本都是價格不菲的商業軟體，除了Express版本和Visual Studio Community。除了Visual Studio，SharpDevelop和Mono也是可用的VB.NET開發環境。資料型別與字面常量表示.VB.Net的資料型別，實際上是.Net Framework定義的資料型別。此外，還有SByte、UShort、UInteger、ULong等無符號資料型別。&amp;O123表示八進位制；&amp;H123表示十六進位制。語法特性.VB使用的名字是大小寫不敏感的。但是，CLR是大小寫敏感的。所以建議保持一致的大小寫。空值.VB自版本5以後的資料型別COM，而其根源是OLE資料型別。在與空值做比較時，需要區分各種不同用法：對於可空型別，實際上是Nullable(Of T)泛型結構。例如，下述三行等價：Dim ridesBusToWork1? As BooleanDim ridesBusToWork2 As Boolean?Dim ridesBusToWork3 As Nullable(Of Boolean)比較表示式someVar = Nothing的結果永遠是Nothing，應該用someVar.HasValue()方法去判斷是否為空，或者用Is或IsNot關鍵字。陣列.Dim arr([upperLimit]) As dataType = new dataType([upperLimit]) {[initialValues]} '宣告陣列arr(index) = value '使用陣列陣列的下標開始自0，這遵從了.NET的標準。如果不指定陣列的下標上界，則為動態陣列，其長度可以動態調整。結構控制語句.分支語句.If 條件 Then語句ElseIf 條件 Then語句Else語句End IfSelect Case VariableCase Value1StatementsCase Value2StatementsCase Value3StatementsCase ElseStatementsEnd Select迴圈語句.包括下述幾種：For varName = 初值 To 終值 [Step 步長]迴圈體語句Next varNameDo [{While|Until} condition]statements[Exit Do]Loop或Dostatements[Exit Do]statementsLoop [{While|Until} condition]While conditionstatements[Exit While]statemenstEnd WhileFor Each element in groupstatementsNext [element]Yield語句.實現迭代器遍歷一個序列，每次獲取一個返回值。迭代器可以作為一個方法或屬性的get訪問器，其中的Yield 語句返回迭代器的返回值，並記住當前執行的位置。下次再呼叫迭代器，從該執行位置恢復執行，直至迭代器程式碼執行完或者遇到Exit Function或Return語句。編譯器把迭代器作為一個狀態機的類。Sub Main()Dim days As New DaysOfTheWeek()For Each day As String In daysConsole.Write(day &amp; " ")Next' Output: Sun Mon Tue Wed Thu Fri SatConsole.ReadKey()End SubPrivate Class DaysOfTheWeekImplements IEnumerablePublic days =Public Iterator Function GetEnumerator() As IEnumerator _Implements IEnumerable.GetEnumerator' Yield each day of the week.For i As Integer = 0 To days.Length - 1Yield days(i)NextEnd FunctionEnd Class物件導向.物件導向時，類的宣告範例：Public Class className [Inherits bassClassName]Public varName As Integer '資料成員Public [ReadOnly/WriteOnly] Property propertyName() As Integer '屬性Public GetReturn m_varEnd GetPublic Set(ByVal value As Integer)m_var=valueEnd SetEnd PropertyPublic Sub subName(ByVal param1 As Integer) '方法End SubPublic Function funcName(ByVal param2 As Integer ) As Integer '函式Return 101End Function[atrributive_list][accessibiliby][Shadows]Event eventName([Parameter]) [Implements interfaces.event] '事件Public Sub new([Parameter]) '類的構造子(constructor)，可以有多個End SubEnd Class上述示例中的Public關鍵字表示可存取性(accessibility)，表示可以被任意程式碼存取；它可以替換為其他的可存取性：Private的Event。使用關鍵字MyBase引用基礎類別。類可用繼承修飾詞：NotInheritable關鍵字，表示該類不能做基礎類別；MustInherit關鍵字，表示這是一個抽象類。類的屬性與方法能否被覆蓋：Overridable關鍵字表示可被覆蓋；Overrides關鍵字表示覆蓋了基礎類別中同名的方法或屬性；NotOverridable關鍵字表示不可覆蓋；MustOverride表示方法或屬性僅宣告沒有實現，這時該類必須有MustInherit修飾詞，是一個抽象類或者介面，僅能包含屬性、方法、函式的宣告。如同其他.Net語，Visual Basic不允許多重繼承，但可以同時實現多個interface。介面.介面是一類特殊的抽象類，不能包括可執行程式碼與類的資料成員的宣告：Interface interfaceNameEvent eventName([param])Property [ReadOnly/WriteOnly] propertyName As typeNameFunction funcName([param]) As returnTypeNameEnd Interface介面中這些成員都強制是Public可存取性。實現一個介面，使用Implements關鍵字：Public Function GetEnumerator() As IEnumerator _Implements IEnumerable.GetEnumerator多型.基於繼承的多型，是指用基礎類別型別的變數繫結不同的子類別物件，這樣呼叫基礎類別變數的方法，在執行時動態確定實際執行了哪個衍生類別的同名的方法。多型的優點是可以針對基礎類別的方法來寫一個通用的過程或者資料容器，適用於各種不同的衍生類別的具體實現。委託.委託本質上是一種Class，衍生自System.Delegate，包含了三部分資料：一個類物件的地址、該物件所屬類的一個方法的地址，以及另一個委託的引用。前兩部分可以實現對一個類物件的方法的呼叫；第三部分把委託形成一個連結串列，使其依次被呼叫執行。如下聲明瞭一個委託：Delegate Sub PlayHandler(ByVal sender As Object, ByVal e As System.EventArgs)委託常用於事件處理。例如：Public Class clsNamePublic Event monitor As PlayHandlerEnd Class對一個具體的例項，可以給它的事件在執行時動態追加上一個或多個事件處理函式：AddHandlerins.monitor, AddressOf playHandle_1AddHandle指向引發事件的物件；AddressOf把一個函式或過程名轉化為一個隱式建立的委託例項，用於確定該事件物件所要呼叫的事件處理程式。在AddressOf關鍵字可隱式建立一個引用特定過程的委託的例項。程式可以丟擲一個事件：Dim WithEvents e As New System.EventArgsDim ins As New clsNameRaiseEvent ins.monitor(ins,e)using語句.using語句，定義一個範圍，在範圍結束時自動釋放物件所佔用的資源。Using conn As New SqlConnection'當在某個程式碼段中使用了類別的例項，而希望無論因為什麼原因，只要離開了這個程式碼段就自動呼叫這個類別例項的Dispose。'執行程式碼End Using自動屬性.例如：Public Property pa As String="物件初始化器.集合物件的初始化與普通類物件的屬性初始化，分別使用From與With關鍵字。例如：Public Class PersonPublic Property age As IntegerPublic Property Name As StringEnd ClassDim personList As New List(Of Person) From {New Person With {.Name = "Qiang", .age = 24},匿名型別.例如：匿名函式或lambda表示式.即無名的函式或過程，作為表示式的值。可以寫為一行或多行。例如：Dim func1=Function(i As integer) i+10Dim action = sub()End SubDim func2 = Function()End Function可以在宣告匿名函式的同時呼叫它。單行的lambda表示式不能使用Return關鍵字，其返回型別是自動推導得出；其引數要麼都是用As關鍵字指明型別，要麼全部是自動推匯出型別。lambda表示式在定義時可以使用所在上下文的區域性變數、引數、屬性、Me等等的值，即使lambda表示式離開了定義時所在的context，這些被使用的區域性變數等的值仍然有效。這是因為lambda表示式在定義時把所用到的context的值儲存到它自己的定義類中。lambda表示式可以巢狀定義。擴充套件方法.例如：Imports System.Runtime.CompilerServicesPublic Function funcName(ByVal ins As className) As String'Do somethingEnd Function異常處理.Try' write the condition hereCatch ex As Exception When condition' Handle Exception when a specific condition is trueCatch ex As Exception' Handle ExceptionFinally' Cleanup, close connections etc' NB this code is always executed regardless of if an Exception was raised or not!End TryLINQ.From element [ As type ] In collection [, element2 [ As type2 ] In collection2 [, ... ] ] [Where 表示式]例子.這裡給出了一個Hello World的例子。透過它們您可以更好地理解Visual Basic的特性。Module Mdl_MainSub Main()Console.WriteLine("Hello World")End SubEnd Module這個程式能輸出"Hello World"。Module Mdl_Main第一行是模組定義，名稱空間的定義一般可以省略。VB.NET中，所有函式，過程與變數的宣告都必須在模組或者類的內部，而不能直接存在於名稱空間內部。Sub Main()第二行定義了名為Main的過程。一般來說，“Sub Main()”是程式的入口點。Console.WriteLine("Hello World")第三行輸出“Hello World”。End Sub第四行結束了過程Main的定義。End Module第五行結束了模組Mdl_Main的定義。與舊版VB比較.與舊版VB相比較，VB.NET明顯受到了.Net Framework中其他語言思想的影響。與舊版VB相比，VB.NET更加嚴格而不失靈活。Visual Basic 6：Private Sub Button1_Click()'Work to doEnd SubVB.NET：Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click'Work to doEnd Sub與C#等C家族語言比較.與C家族語言相比，VB.NET則較多保留了VB的特徵，比如：下面這兩份功能一致的程式碼展現出了VB.NET與C#的很多不同之處：Namespace N'CommentModule MPublic Function GetSum(arr() As Integer) As IntegerDim Sum = 0 'Auto Type InferDim i As IntegerFor Each i In arrSum += iNextReturn SumEnd FunctionEnd ModuleClass CPrivate v As IntegerPublic Function F() As IntegerReturn v * vEnd FunctionPublic Sub S(value As Integer)Me.v = valueEnd SubPublic Sub New() 'ConstructorMe.v = 0End SubEnd ClassEnd Namespacenamespace N//Commentstatic class Mint GetSum(int[] arr)var Sum = 0;int i;foreach(i in arr)Sum += i;return Sum;};class Cprivate:int v;public:int F()return v * v;void S(int value)this.v = value;C() //Constructorthis.v = 0;};VB.NET與C#同為.Net Framework的兩大主力程式設計語言，儘管有著各種各樣的不同，兩者最終都編譯為MSIL並由CLR執行。兩者功能基本一致，並可以在.Net Framework框架下方便地互相呼叫與協同開發。關於兩者的優劣一直見仁見智。呼叫C語言函式的規範.C語言編寫的DLL檔案，VB在呼叫時，需要注意：對於C語言的陣列指標，在VB中呼叫時應將陣列的首元素傳遞給DLL。不能直接傳遞陣列名,因為如果傳遞陣列名,VB實際會傳一個複雜的結構型別給DLL。C函式無法確定陣列大小，通常用另一個引數指出陣列的大小。Public Sub test(ByVal param As Integer, ByRef OK As Integer)End Sub'下述方法只能使用_stdcall呼叫約定：Public Declare Function test1 Lib "D:\PackingDLL.dll" Alias "_test@4" (ByVal param As Integer) As Integer歷史.2002年Visual Basic .NET.Visual Basic .NET比VB6大了十倍，儲存器使用量也大大增加。VB 7.0引起了廣泛的爭議，主要原因在於對舊版VB的改動過大。許多資深的VB程式設計師抱怨VB.NET，因為VB.NET 2002丟掉了許多不再發行的VB6中使用的大量語言結構和使用者介面功能，並且對保留下來的東西也改變了語意。例如，在VB.NET引數預設是以值方式傳遞的，而不是以引用方式。VB.NET 2002被半嘲諷半認真地稱為Visual Fred或VB DOTNOT。作為對2005年3月8日微軟拒絕為VB6再提供維護與支援的回應，當月月底出現了反對者的請願。VB.NET的支持者們認為新語言在很多方面比舊版本更為強大，比如它以相比早期版本更為自然、緊密和完全的方式地加入了現代面向物件的程式設計正規化。反對者們有不同意見，雖然VB6對物件模型支援有缺點，但是二次開發升級到VB.NET的成本比升級後的收益要高得多。而開發軟體釋出因特網版本的獨立程式設計師也對VB.NET的RunTime尺寸過大不滿。針對開發者的不滿，微軟主要做了如下努力：使新的開發更容易啟動，而把已經開發的VB6程式碼升級到VB.NET。例子主要包括：完成VB6中的常見任務如列印預覽；整合VB6和VB.NET解決方案，從VB6程式碼轉換到VB.NET。微軟在後續版本中撤銷了一些過激的更改，並且吸取了經驗。在以後版本中，語法的更改變得更加謹慎。2003年Visual Basic .NET 2003.Visual Basic .NET 2003，它是分發給各國某些學者免費使用的版本。2005年Visual Basic 2005.Visual Basic 2005是VB.Net的重大轉變，微軟決意在其軟體名稱中去掉了.NET部份。在VB2005中，微軟增加了許多新功能，以引用VB對於初學者來說的一些優點：主要的變動：2008年Visual Basic 2008.Visual Basic 2008於2007年11月9日與Microsoft .NET Framework 3.5一起釋出。在VB2008中，微軟增加了許多功能，包括：2010年Visual Basic 2010.Visual Basic 2010於2010年4月釋出。2015年Visual Basic 2015.Visual Basic 2015於2015年7月20日釋出。2022年Visual Basic 2022.2022 年 9 月 13 日 - Visual Studio 2022 17.0.14版 NewReleaseIcon2022 年 8 月 9 日 - Visual Studio 2022 17.0.13版2022 年 7 月 12 日 - Visual Studio 2022 17.0.12 版2022 年 6 月 14 日 - Visual Studio 2022 17.0.11版2022 年 5 月 10 日 - Visual Studio 2022 17.0.10 版2022 年 4 月 19 日 - Visual Studio 2022 17.0.9版2022 年 4 月 12 日 - Visual Studio 2022 17.0.8版2022 年 3 月 8 日 - Visual Studio 2022 17.0.7 版2022 年 2 月 8 日 - Visual Studio 2022 17.0.6版2022 年 1 月 13 日 - Visual Studio 2022 17.0.5 版2021 年12 月 16 日 - Visual Studio 2022 17.0.4版2021 年 12 月 14 日 - Visual Studio 2022 17.0.3 版2021 年 11 月 30 日 - Visual Studio 2022 17.0.2版2021 年 11 月 16 日 - Visual Studio 2022 17.0.1版2021 年 11 月 8 日 - Visual Studio 2022 17.0.0 版其他.