共用方式為


隱含和明確宣告

更新:2007 年 11 月

在預設的情況下,Visual Basic 編譯器會強制使用「明確宣告」(Explicit Declaration),也就是您需要在使用每個變數之前先行宣告。您可以移除此需求並允許「隱含宣告」。

Visual Basic 提供用來控制明確宣告的參數。根據預設,此參數設定為 On,且編譯器會強制使用明確宣告。如果此參數採用 Off,您不需要宣告就可以使用變數。

**明確宣告參數。**設定明確宣告參數為 On 或 Off 包括以下幾種方式:

  • 在整合式開發環境 (IDE) 中設定適當的專案屬性。按一下 [專案] 功能表中的 [<ProjectName> 屬性],然後按一下 [編譯] 索引標籤。您可以設定 [Option explicit]、[Option strict] 和 [Option compare] 的預設值。

  • 指定 /optionexplicit 命令列編譯器選項。

  • 在程式碼開頭加上 Option Explicit 陳述式 (Visual Basic)

如果使用 OptionExplicit 陳述式,則該設定會覆寫專案屬性及編譯器選項設定,但這只會影響陳述式所在的原始程式碼檔案。

**效能優點。**設定 OptionExplicit 為 On 的優點是強制在編譯時期而非執行階段推斷型別。這會增加效能。

隱含宣告

如果將 OptionExplicit 設定為 Off,可以在程式碼中直接使用變數,即會隱含宣告該變數。編譯器會為所有隱含宣告的變數指派 Object 資料型別。但如果您能以特定資料型別來明確宣告所有變數,則應用程式運作起來會更有效率。這能夠減少命名衝突錯誤及拼字錯誤的發生率。同時,編譯器也會偵測可能發生的執行階段錯誤,例如將 Integer 指派至 Short。

可能的錯誤

預期外的新變數

您可以撰寫一個沒有宣告區域變數的程序。下面這個範例可說明這點:

Function safeSqrt(num)
' Make sure num is positive for square root.
    tempVal = Math.Abs(num)
    Return Math.Sqrt(tempVal)
End Function

Visual Basic 會自動將 tempVal 建立為區域變數,而您就可以像是先前已經明確宣告一般來使用。儘管這很方便,但若您輸入的變數名稱有誤,您的程式碼就會出現小錯誤。假設您已在先前範例中寫入下列程序:

Function safeSqrt(num)
' Make sure num is positive for square root.
    tempVal = Math.Abs(num)
    Return Math.Sqrt(temVal)
End Function

這程式碼乍看之下並無不同。但由於 tempVal 變數被錯拼為 Sqrt 的引數,使得編譯器會建立另一個稱為 temVal 的區域變數,因為此變數永遠不會有指派值,所以您的函式永遠都只會傳回零。

預期外的現有項目參考

當 Visual Basic 遇到新名稱時,它無法判斷您是要隱含宣告新變數還是拼錯現有變數的名稱。因此,它會嘗試以該名稱來建立新變數。而可能會有變數或其他程式設計項目已經使用該名稱定義,您的程式碼將會在無意之間使用該定義。

您可以使用明確宣告來避免錯誤命名變數。

明確宣告

如果在前述範例中包含 safeSqrt 程序的原始程式檔 (Source File) 已採用明確宣告,Visual Basic 就會將 tempVal 和 temVal 辨認為未宣告的變數,然後針對這兩個變數產生錯誤。因此,接下來您就要明確宣告 tempVal。下面這個範例可說明這點:

Function safeSqrt(ByVal num As Double) As Double
' Make sure num is positive for square root.
    Dim tempVal As Double = Math.Abs(num)
    Return Math.Sqrt(temVal)
End Function

利用以上修改的程式碼,您可以很快找出問題所在,因為 Visual Basic 會針對拼字有誤的 temVal 顯示錯誤訊息。由於明確宣告能夠幫助您找出這類錯誤,因此我們建議您的程式碼都使用明確宣告。

注意事項:

OptionExplicit 陳述式是以檔案為基礎而作業的。它必須出現在每個要強制使用明確變數宣告的原始程式檔開頭。

請參閱

工作

HOW TO:修改專案屬性和組態設定

概念

Visual Basic 中的不具型別程式設計

Visual Basic 中的型別檢查

做為通用資料型別的物件

有效率地使用資料型別

Visual Basic 中的變數

Visual Basic 命名慣例

參考

資料型別摘要 (Visual Basic)

型別轉換函式