Visual Basic .NET

語法特性

VB使用的名字是大小寫不敏感的。但是，CLR是大小寫敏感的。所以建議保持一致的大小寫。

陣列

Dim arr([upperLimit]) As dataType = new dataType([upperLimit]) {[initialValues]} '声明数组arr(index) = value   '使用数组
陣列的下標開始自0，這遵從了.NET的標準。如果不指定陣列的下標上界，則為動態陣列，其長度可以動態調整。

Yield語句

實現疊代器遍歷一個序列，每次取得一個返回值。疊代器可以作為一個方法或屬性的get存取器，其中的Yield 語句返回疊代器的返回值，並記住目前執行的位置。下次再呼叫疊代器，從該執行位置恢復執行，直至疊代器程式碼執行完或者遇到Exit Function或Return語句。編譯器把疊代器作為一個狀態機的類。   
Sub Main()
    Dim days As New DaysOfTheWeek()
    For Each day As String In days
        Console.Write(day & " ")
    Next 
    ' Output: Sun Mon Tue Wed Thu Fri Sat
    Console.ReadKey()End Sub 

Private Class DaysOfTheWeek
    Implements IEnumerable

    Public days =
        New String() {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}

    Public Iterator Function GetEnumerator() As IEnumerator _
        Implements IEnumerable.GetEnumerator

        ' Yield each day of the week. 
        For i As Integer = 0 To days.Length - 1
            Yield days(i)
        Next 
    End Function 
End Class

物件導向

物件導向時，類的聲明範例：
Public Class className [Inherits bassClassName]
    Public varName As Integer '資料成員
    Public [ReadOnly/WriteOnly] Property propertyName() As Integer '屬性
        Public Get
            Return m_var
        End Get
        Public Set(ByVal value As Integer) 
            m_var=value
        End  Set
    End Property
    Public Sub subName(ByVal param1 As Integer) '方法
    End Sub
    Public Function funcName(ByVal param2 As Integer ) As Integer '函數
         Return 101
    End Function
    [atrributive_list][accessibiliby][Shadows]Event eventName([Parameter]) [Implements interfaces.event] '事件
    Public Sub new([Parameter]) '類的構造子(constructor)，可以有多個（即可以重載）
    End SubEnd Class
上述範例中的Public關鍵字表示可存取性(accessibility)，表示可以被任意程式碼存取；它可以替換為其他的可存取性：Private（僅限該Class自身存取）、Friend（僅限同一項目中的程式碼存取）、Protected（僅限自身或衍生類別存取）、Protected Friend等。如果使用ReadOnly，則表示資料成員或屬性是唯讀；WriteOnly表示只寫。Shadows關鍵字表示覆蓋父類中同名（但不一定參數相同）的Event。使用關鍵字MyBase參照基礎類別。
類可用繼承修飾詞：NotInheritable關鍵字，表示該類不能做基礎類別；MustInherit關鍵字，表示這是一個抽象類。
類的屬性與方法能否被覆蓋：Overridable關鍵字表示可被覆蓋；Overrides關鍵字表示覆蓋了基礎類別中同名的方法或屬性；NotOverridable關鍵字表示不可覆蓋；MustOverride表示方法或屬性僅聲明沒有實現，這時該類必須有MustInherit修飾詞，是一個抽象類或者介面，僅能包含屬性、方法、函式的聲明。
如同其他.Net語，Visual Basic不允許多重繼承，但可以同時實現多個interface。

介面（interface）

介面是一類特殊的抽象類，不能包括可執行程式碼與類的資料成員的聲明：
    Interface interfaceName
       Event eventName([param])
       Property [ReadOnly/WriteOnly] propertyName As typeName
       Function funcName([param]) As returnTypeName
    End Interface
介面中這些成員都強制是Public可存取性。
實現一個介面，使用Implements關鍵字：
Public Function GetEnumerator() As IEnumerator _
        Implements IEnumerable.GetEnumerator

多型（Polymetric）

基於繼承的多型，是指用基礎類別類型的變數繫結不同的子類別物件，這樣呼叫基礎類別變數的方法，在執行時動態確定實際執行了哪個衍生類別的同名的方法。多型的優點是可以針對基礎類別（或介面）的方法來寫一個通用的過程或者資料容器，適用於各種不同的衍生類別的具體實現。

委託（Delegate）

委託本質上是一種Class，衍生自System.Delegate，包含了三部分資料：一個類物件的位址、該物件所屬類的一個方法的位址，以及另一個委託的參照（reference）。前兩部分可以實現對一個類物件的方法的呼叫；第三部分把委託形成一個連結串列，使其依次被呼叫執行。如下聲明了一個委託：
 Delegate Sub PlayHandler(ByVal sender As Object, ByVal e As System.EventArgs)
委託常用於事件處理（Event Handler）。.Net Framework的事件是類的屬性（實際上是一個巢狀類），用於封裝參數格式固定的委託；該委託的參數總是為(ByVal sender As Object, ByVal e as System.EventArgs)，返回值為void（即Sub類型）。例如：
 Public Class clsName
    Public Event monitor As PlayHandler
 End Class
對一個具體的實體，可以給它的事件在運行時動態追加上一個或多個事件處理函式：
 AddHandlerins.monitor, AddressOf playHandle_1
AddHandle指向引發事件的物件；AddressOf把一個函式或過程名轉化為一個隱式建立的委託實體，用於確定該事件物件所要呼叫的事件處理程式。在AddressOf關鍵字可隱式建立一個參照特定過程的委託的實體。
程式可以丟擲一個事件：
 Dim WithEvents e As New System.EventArgs
 Dim ins As New clsName
 RaiseEvent ins.monitor(ins,e)

using語句

using語句，定義一個範圍，在範圍結束時自動釋放物件所占用的資源。
Using conn As New SqlConnection'當在某個程式碼段中使用了類別的實體，而希望無論因為什麼原因，只要離開了這個程式碼段就自動呼叫這個類別實體的Dispose。
   '執行程式碼
End Using

自動屬性

例如：
Public Property pa As String=""

物件初始化器

集合（Collection）物件的初始化與普通類物件的屬性初始化，分別使用From與With關鍵字。例如：
    Public Class Person
        Public Property age As Integer
        Public Property Name As String
    End Class

    Dim personList As New List(Of Person) From {
        New Person With {.Name = "Qiang", .age = 24},
        New Person With {.Name = "Wei", .age = 42}
        }

匿名類型

例如：
Dim people = New With {.name="kyo", .age=22}

匿名函式或lambda表達式

即無名的函式或過程，作為表達式的值。可以寫為一行或多行。例如：
Dim func1=Function(i As integer) i+10
Dim action = sub()
  End Sub
Dim func2 = Function()
  End Function
可以在聲明匿名函式的同時呼叫它。單行的lambda表達式不能使用Return關鍵字，其返回類型是自動推導得出；其參數要麼都是用As關鍵字指明類型，要麼全部是自動推導出類型。
lambda表達式在定義時可以使用所在上下文（context，即C++語言的閉包closure）的局部變數、參數、屬性、Me等等的值，即使lambda表達式離開了定義時所在的context，這些被使用的局部變數等的值仍然有效。這是因為lambda表達式在定義時把所用到的context的值儲存到它自己的定義類中。lambda表達式可以巢狀定義。

擴充方法

例如：
Imports System.Runtime.CompilerServices
<Extension()> Public Function funcName(ByVal ins As className) As String
    'Do something
End 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 Try

LINQ

From element [ As type ] In collection [, element2 [ As type2 ] In collection2 [, ... ] ] [Where 表达式]

例子（Hello World）

這裡給出了一個Hello World的例子。通過它們您可以更好地理解Visual Basic的特性。（此原始碼執行於命令列下）
Module Mdl_Main
    Sub 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的定義。

呼叫C語言函式的規範

C語言編寫的DLL檔案，VB在呼叫時，需要注意：對於C語言的陣列指標，在VB中呼叫時應將陣列的首元素傳遞給DLL。不能直接傳遞陣列名,因為如果傳遞陣列名,VB實際會傳一個複雜的結構類型給DLL。C函式無法確定陣列大小，通常用另一個參數指出陣列的大小。
<DllImport("D:\GenericMESDLL.dll", CharSet:=CharSet.Unicode, CallingConvention:=CallingConvention.Cdecl)>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（VB 7.0）

Visual Basic .NET（VB 7.0）是隨Visual C#和ASP.NET一起在2002年發布的最初始的VB.NET版本。C#被大力宣傳為微軟對付JAVA的王牌，受到媒體極力關注。然而VB.NET（有時被稱為VB 7.0）影響面不廣，這導致VB社群之外很少人關注它。那些試用過此版VB.NET的人在層層幕布下發現一個強大卻艱深的語言，而且還有不少缺點，例如它的執行階段元件（Run-Time）比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解決方案（dubbed VB Fusion），從VB6程式碼轉換到VB.NET。
微軟在後續版本中復原了一些過激的更改，並且吸取了經驗。在以後版本中，語法的更改變得更加謹慎。

2003年Visual Basic .NET 2003（VB 7.0）

Visual Basic .NET 2003（VB 7.0）和.NET Framework 1.1一起發布。新功能包括對.NET Compact Framework的支援和更好的VB升遷精靈。並改進了執行狀況，IDE穩定性（尤其是後台編譯器），以及執行時RunTime穩定性。另外，VB.NET 2003還有一個學院版Visual Studio .NET 2003 Academic Edition（VS03AE），它是分發給各國某些學者免費使用的版本。

2010年Visual Basic 2010（VB 10.0）

Visual Basic 2010於2010年4月發布。

2015年Visual Basic 2015（VB 14.0）

Visual Basic 2015（VB 14.0）於2015年7月20日發布。