Visual Basic 中的陳述式

Visual Basic 中的陳述式是完整指示。 它可以包含關鍵字、運算子、變數、常數和運算式。 每個陳述式都屬於下列其中一個類別:

  • 宣告陳述式,可命名變數、常數或程序,也可指定資料類型。

  • 可執行的陳述式,可起始動作。 這些陳述式可以呼叫方法或函式,也可以對程式碼區塊執行迴圈或分支。 可執行的陳述式包括指派陳述式,可將值或運算式指派給變數或常數。

本主題會描述每個類別。 此外,本主題也會說明如何將多個陳述式合併成一行,以及如何在多行上繼續執行陳述式。

宣告陳述式

您可以使用宣告陳述式來命名和定義程序、變數、屬性、陣列和常數。 當您宣告程式設計元素時,您也可以定義其資料類型、存取層級和範圍。 如需詳細資訊,請參閱宣告元素特性

下列範例包含三個宣告。

Public Sub ApplyFormat()
    Const limit As Integer = 33
    Dim thisWidget As New widget
    ' Insert code to implement the procedure.
End Sub

第一個宣告是 Sub 陳述式。 它會與其相對應的 End Sub 陳述式一起使用,以宣告名為 applyFormat 的程序。 它也會指定 applyFormatPublic,這表示任何參考此程序的程式碼都可以呼叫此程序。

第二個宣告是 Const 陳述式,可宣告常數 limit,並指定 Integer 資料類型和值 33。

第三個宣告是 Dim 陳述式,可宣告變數 thisWidget。 資料類型是特定物件,也就是從 Widget 類別建立的物件。 您可以將變數宣告為任何基礎資料型別 (Elementary Data Type),或是您使用之應用程式所公開的任何物件類型。

初始值

執行包含宣告陳述式的程式碼時,Visual Basic 會保留宣告元素所需的記憶體。 如果元素具有值,Visual Basic 會將元素初始化為其資料類型的預設值。 如需詳細資訊,請參閱 Dim 陳述式中的<行為>。

您可以將初始值指派給變數作為其宣告的一部分,如下列範例所示。

Dim m As Integer = 45
' The preceding declaration creates m and assigns the value 45 to it.

如果變數是物件變數,當您使用 New 運算子關鍵字宣告變數時,就可以明確地建立其類別的執行個體,如下列範例所示。

Dim f As New FileInfo("filename")

請注意,在宣告陳述式中指定的初始值,在執行到其宣告陳述式之前不會指派給變數。 在這之前,變數會包含其資料類型的預設值。

可執行的陳述式

可執行的陳述式會執行動作。 它可以呼叫程序、分支到程式碼中的其他位置、對數個陳述式執行迴圈,或評估運算式。 指派陳述式是可執行陳述式的特殊案例。

下列範例會使用 If...Then...Else 控制結構,根據變數的值來執行不同的程式碼區塊。 在每個程式碼區塊內,For...Next 迴圈會執行指定的次數。

Public Sub StartWidget(ByVal aWidget As widget,
    ByVal clockwise As Boolean, ByVal revolutions As Integer)
    Dim counter As Integer
    If clockwise = True Then
        For counter = 1 To revolutions
            aWidget.SpinClockwise()
        Next counter
    Else
        For counter = 1 To revolutions
            aWidget.SpinCounterClockwise()
        Next counter
    End If
End Sub

上述範例中的 If 陳述式會檢查 clockwise 參數的值。 如果值為 True,則會呼叫 aWidgetspinClockwise 方法。 如果值為 False,則會呼叫 aWidgetspinCounterClockwise 方法。 If...Then...Else 控制結構是以 End If 結尾。

每個區塊內的 For...Next 迴圈會呼叫適當的方法幾次 (該次數會等於 revolutions 參數的值)。

指派陳述式

指派陳述式會執行指派作業,包括從指派運算子 (=) 的右側取得值,並將其儲存在左側元素中,如下列範例所示。

v = 42

在上述範例中,指派陳述式會將常值 42 儲存在變數 v 中。

合格的程式設計元素

指派運算子左側的程式設計元素必須能夠接受並儲存值。 這表示它必須是非 ReadOnly 的變數或屬性,或者必須是陣列元素。 在指派陳述式的內容中,這類元素有時稱為「左值」

指派運算子右側的值是由運算式所產生,可包含常值、常數、變數、屬性、陣列元素、其他運算式或函式呼叫的任何組合。 說明如下例。

x = y + z + FindResult(3)

上述範例會將變數 y 中保留的值新增至變數 z 中保留的值,然後新增呼叫 findResult 函式所傳回的值。 此運算式的總值接著會儲存在變數 x 中。

指派陳述式中的資料類型

除了數值之外,指派運算子也可以指派 String 值,如下列範例所示。

Dim a, b As String
a = "String variable assignment"
b = "Con" & "cat" & "enation"
' The preceding statement assigns the value "Concatenation" to b.

您也可以使用 Boolean 常值或 Boolean 運算式來指派 Boolean 值,如下列範例所示。

Dim r, s, t As Boolean
r = True
s = 45 > 1003
t = 45 > 1003 Or 45 > 17
' The preceding statements assign False to s and True to t.

同樣地,您可以將適當的值指派給 CharDateObject 資料類型的程式設計元素。 您也可以將物件執行個體指派給宣告屬於建立該執行個體之來源類別的元素。

複合指派陳述式

「複合指派陳述式」會先對運算式執行作業,再將其指派給程式設計元素。 下列範例說明下列其中一個運算子 +=,它會依運算式右側的值遞增運算子左側的變數值。

n += 1

上述範例會將 n 的值加 1,然後將新的值儲存在 n 中。 這是下列陳述式的速記對等項目:

n = n + 1

您可以使用此類型的運算子來執行各種複合指派作業。 如需這些運算子的清單及其詳細資訊,請參閱指派運算子

串連指派運算子 (&=) 可用於將字串新增至已存在的字串結尾,如下列範例所示。

Dim q As String = "Sample "
q &= "String"
' q now contains "Sample String".

指派陳述式中的類型轉換

您指派給變數、屬性或陣列元素的值必須適用於該目的地元素的資料類型。 一般而言,您應該嘗試產生與目的地元素具有相同資料類型的值。 不過,有些類型可以在指派期間轉換成其他類型。

如需在資料類型之間轉換的資訊,請參閱 Visual Basic 中的類型轉換。 簡單來說,Visual Basic 會自動將指定類型的值轉換成其所放大的任何其他類型。 「放大轉換」一律會在執行階段成功,而且不會遺失任何資料。 例如,Visual Basic 會在適當時將 Integer 值轉換成 Double,因為 Integer 會放大至 Double。 如需詳細資訊,請參閱 Widening and Narrowing Conversions

「縮小轉換」(不會放大的轉換) 具有執行階段失敗或資料遺失的風險。 您可以使用類型轉換函式明確地執行縮小轉換,也可以透過設定 Option Strict Off 來指示編譯器隱含地執行所有轉換。 如需詳細資訊,請參閱隱含和明確轉換

將多個陳述式放在一行

您可以將多個陳述式放在一行,並以冒號 (:) 字元分隔。 說明如下例。

Dim sampleString As String = "Hello World" : MsgBox(sampleString)

這種形式的語法雖然偶爾方便,但會讓您的程式碼難以閱讀和維護。 因此,建議您將一個陳述式保持為一行。

在多行上繼續執行陳述式

一個陳述式通常可以納入一行,但如果太長,您可以使用行接續序列繼續執行到下一行,其格式為一個空格後面依序接著底線字元 (_) 和歸位字元。 在下列範例中,可執行的陳述式 MsgBox 會分兩行繼續執行。

Public Sub DemoBox()
    Dim nameVar As String
    nameVar = "John"
    MsgBox("Hello " & nameVar _
        & ". How are you?")
End Sub

隱含行接續

在許多情況下,您可以在下一個連續行上繼續執行陳述式,而不需要使用底線字元 (_)。 下列語法元素會隱含地在下一行程式碼上繼續執行陳述式。

  • 在逗號 (,) 之後。 例如:

    Public Function GetUsername(ByVal username As String,
                                ByVal delimiter As Char,
                                ByVal position As Integer) As String
    
        Return username.Split(delimiter)(position)
    End Function
    
  • 在左括弧 (() 之後或右括弧 ()) 之前。 例如:

    Dim username = GetUsername(
        Security.Principal.WindowsIdentity.GetCurrent().Name,
        CChar("\"),
        1
      )
    
  • 在左大括號 ({) 之後或右大括號 (}) 之前。 例如:

    Dim customer = New Customer With {
      .Name = "Terry Adams",
      .Company = "Adventure Works",
      .Email = "terry@www.adventure-works.com"
    }
    

    如需詳細資訊,請參閱物件初始設定式:具名和匿名型別集合初始設定式

  • 在 XML 常值內的內嵌運算式開頭 (<%=) 之後或內嵌運算式結尾 (%>) 之前。 例如:

    Dim customerXml = <Customer>
                          <Name>
                              <%=
                                  customer.Name
                              %>
                          </Name>
                          <Email>
                              <%=
                                  customer.Email
                              %>
                          </Email>
                      </Customer>
    

    如需詳細資訊,請參閱 XML 中的內嵌運算式

  • 在串連運算子 (&) 之後。 例如:

    cmd.CommandText = 
        "SELECT * FROM Titles JOIN Publishers " &
        "ON Publishers.PubId = Titles.PubID " &
        "WHERE Publishers.State = 'CA'"
    

    如需詳細資訊,請參閱依功能列出的運算子

  • 在指派運算子 (=&=:=+=-=*=/=\=^=<<=>>=) 之後。 例如:

    Dim fileStream =
      My.Computer.FileSystem.
        OpenTextFileReader(filePath)
    

    如需詳細資訊,請參閱依功能列出的運算子

  • 在運算式內的二元運算子 (+-/*Mod<><><=>=^>><<AndAndAlsoOrOrElseLikeXor) 之後。 例如:

    Dim memoryInUse =
      My.Computer.Info.TotalPhysicalMemory +
      My.Computer.Info.TotalVirtualMemory -
      My.Computer.Info.AvailablePhysicalMemory -
      My.Computer.Info.AvailableVirtualMemory
    

    如需詳細資訊,請參閱依功能列出的運算子

  • IsIsNot 運算子之後。 例如:

    If TypeOf inStream Is 
      IO.FileStream AndAlso
      inStream IsNot
      Nothing Then
    
        ReadFile(inStream)
    
    End If
    

    如需詳細資訊,請參閱依功能列出的運算子

  • 在成員限定詞字元 (.) 之後和成員名稱之前。 例如:

    Dim fileStream =
      My.Computer.FileSystem.
        OpenTextFileReader(filePath)
    

    不過,當您使用 With 陳述式或在類型的初始化清單中提供值時,您必須在成員限定詞字元後面加入行接續字元 (_)。 例如,當您使用 With 陳述式或物件初始化清單時,請考慮在指派運算子 (例如 =) 之後斷行。 例如:

    ' Not allowed:
    ' Dim aType = New With { .
    '    PropertyName = "Value"
    
    ' Allowed:
    Dim aType = New With {.PropertyName =
        "Value"}
    
    
    
    Dim log As New EventLog()
    
    ' Not allowed:
    ' With log
    '    .
    '      Source = "Application"
    ' End With
    
    ' Allowed:
    With log
        .Source =
          "Application"
    End With
    

    如需詳細資訊,請參閱 With...End With 陳述式物件初始設定式:具名和匿名型別

  • 在 XML 軸屬性限定詞 (..@...) 之後。 不過,如果您使用 With 關鍵字,則必須在指定成員限定詞時加入行接續字元 (_)。 例如:

    Dim customerName = customerXml.
      <Name>.Value
    
    Dim customerEmail = customerXml...
      <Email>.Value
    

    如需詳細資訊,請參閱 XML 軸屬性

  • 當您指定屬性時,在小於符號 (<) 之後或大於符號 (>) 之前。 此外,當您指定屬性時,在大於符號 (>) 之後。 不過,當您指定組件層級或模組層級屬性時,則必須加入行接續字元 (_)。 例如:

    <
    Serializable()
    >
    Public Class Customer
        Public Property Name As String
        Public Property Company As String
        Public Property Email As String
    End Class
    

    如需詳細資訊,請參閱屬性概觀

  • 在查詢運算子 (AggregateDistinctFromGroup ByGroup JoinJoinLetOrder BySelectSkipSkip WhileTakeTake WhileWhereInIntoOnAscendingDescending) 的前後。 您無法在由多個關鍵字 (Order ByGroup JoinTake WhileSkip While) 組成的查詢運算子關鍵字之間斷行。 例如:

    Dim vsProcesses = From proc In
                        Process.GetProcesses
                      Where proc.MainWindowTitle.Contains("Visual Studio")
                      Select proc.ProcessName, proc.Id,
                             proc.MainWindowTitle
    

    如需詳細資訊,請參閱查詢

  • For Each 陳述式中的 In 關鍵字之後。 例如:

    For Each p In
      vsProcesses
    
        Console.WriteLine("{0}" & vbTab & "{1}" & vbTab & "{2}",
          p.ProcessName,
          p.Id,
          p.MainWindowTitle)
    Next
    

    如需詳細資訊,請參閱 For Each...Next 陳述式

  • 在集合初始設定式中的 From 關鍵字之後。 例如:

    Dim days = New List(Of String) From
      {
       "Mo", "Tu", "We", "Th", "F", "Sa", "Su"
      }
    

    如需詳細資訊,請參閱集合初始設定式

新增註解

原始程式碼不一定一看就懂,即使對撰寫的程式設計人員也一樣。 因此,為了協助說明其程式碼,大部分的程式設計人員都會大量使用內嵌註解。 程式碼中的註解可向稍後閱讀或使用程式碼的任何人說明程序或特定指示。 Visual Basic 會在編譯期間忽略註解,這些註解不會影響編譯的程式碼。

註解行是以單引號 (') 或 REM 後面接著空格開頭。 您可以在程式碼中的任何位置新增註解,但字串內除外。 若要將註解附加至陳述式,請在陳述式之後插入單引號或 REM,後面接著註解。 註解也可以自成一行。 下列範例示範這些可能情況。

' This is a comment on a separate code line.
REM This is another comment on a separate code line.
x += a(i) * b(i) ' Add this amount to total.
MsgBox(statusMessage) REM Inform operator of status.

檢查編譯錯誤

如果在鍵入程式碼行之後,該行以藍色波浪底線顯示 (也可能會出現錯誤訊息),則陳述式中有語法錯誤。 您必須查看工作清單,或是將滑鼠指標暫留在錯誤上方來閱讀錯誤訊息,以了解陳述式發生什麼問題,並加以修正。 在您修正程式碼中的所有語法錯誤之前,您的程式將無法正確編譯。

詞彙 定義
指派運算子 提供涵蓋指派運算子 (例如 =*=&=) 的語言參考頁面連結。
運算子和運算式 示範如何將元素與運算子結合,以產生新的值。
操作說明:在程式碼內中斷和合併陳述式 示範如何將單一陳述式分成多行,以及如何將多個陳述式放在同一行。
操作說明:標記陳述式 示範如何標記程式碼行。