共用方式為


Visual Basic 中的範圍

宣告元素的範圍是所有可以參考它而不需要修飾其名稱或透過 Imports 語句(.NET 命名空間和型別)來提供它的程式碼集合。 元素可以具有下列其中一個層級的範圍:

等級 說明
封鎖範圍 僅在宣告它的程式代碼區塊內有效
程序範圍 可供宣告中程序內的所有代碼使用
模組範圍 宣告於模組、類別或結構內的所有程式碼均可使用
命名空間範圍 可供其所屬命名空間中的所有程式碼使用

範圍層級會從最窄(區塊)進展到最寬的 (命名空間),其中 最窄的範圍 表示可以參考元素的最小一組程序代碼,而不需要限定性。 如需詳細資訊,請參閱此頁面上的「範疇等級」。

指定範圍和定義變數

您可以在宣告專案時指定項目的範圍。 範圍可能取決於下列因素:

  • 宣告元素的區域(區塊、程式、模組、類別或結構)

  • 元素宣告所在的命名空間

  • 您為專案宣告的存取層級

當您使用相同名稱但不同的範圍來定義變數時,請小心,因為這樣做可能會導致非預期的結果。 如需詳細資訊,請參閱 宣告項目的參考

範疇層次

您所宣告的程式元素在整個區域內均可用。 相同區域中的所有程式代碼都可以參考元素,而不需要限定其名稱。

區塊範圍

區塊是一組包含在起始和終止宣告語句內的語句,如下所示:

  • DoLoop

  • For [Each] 和 Next

  • IfEnd If

  • SelectEnd Select

  • SyncLockEnd SyncLock

  • TryEnd Try

  • WhileEnd While

  • WithEnd With

如果您在區塊內宣告變數,則只能在該區塊內使用它。 在下列範例中,整數變數cube的範圍是在IfEnd If之間的區塊內,而當執行離開該區塊時,您就無法再參考cube變數。

If n < 1291 Then
    Dim cube As Integer
    cube = n ^ 3
End If

備註

即使變數的範圍僅限於區塊,其存留期仍為整個程式的存留期。 如果您在程式中輸入區塊一次以上,則每個區塊變數都會保留其先前的值。 為了避免這類情況產生非預期的結果,最好在區塊開頭初始化區塊變數。

程序範圍

在程式內宣告的項目無法在該程式外部使用。 只有包含宣告的程式才能使用它。 此層級的變數也稱為 局部變數。 您可以使用 Dim 語句來宣告它們,其中含有或不含 Static 關鍵詞。

程序和區塊範圍密切相關。 如果您在程式內宣告變數,但在該程式內的任何區塊之外,您可以將變數視為具有區塊範圍,其中區塊是整個程式。

備註

所有局部元素,即使它們是 Static 變數,也是它們所屬程序的私有元素。 您無法在程序中使用 Public 關鍵詞宣告任何元素。

模組範圍

為了方便起見,單一詞彙 模組層級 同樣適用於模組、類別和結構。 您可以將宣告語句放在任何程式或區塊之外,但放在模組、類別或結構內,以在這個層級宣告元素。

當您在模組層級進行宣告時,您選擇的存取層級會決定範圍。 包含模組、類別或結構的命名空間也會影響範圍。

宣告 私用 存取層級的元素可供該模組中的每個程序使用,但不適用於不同模組中的任何代碼。 如果您未使用任何存取層級關鍵字,模組層級的Dim語句將預設為Private。 不過,您可以在語句中的 Private 關鍵詞中使用 Dim,讓範圍和存取層級更加明顯。

在下列範例中,模組中定義的所有程式都可以參考字串變數 strMsg。 呼叫第二個程式時,它會在對話框中顯示字串變數 strMsg 的內容。

' Put the following declaration at module level (not in any procedure).
Private strMsg As String
' Put the following Sub procedure in the same module.
Sub initializePrivateVariable()
    strMsg = "This variable cannot be used outside this module."
End Sub
' Put the following Sub procedure in the same module.
Sub usePrivateVariable()
    MsgBox(strMsg)
End Sub

命名空間範圍

如果您使用 FriendPublic 關鍵詞在模組層級宣告專案,則會讓宣告元素之命名空間中的所有程式都能使用。 根據之前範例的以下更改,字串變數 strMsg 可以在其宣告命名空間內的任何程式碼位置被引用。

' Include this declaration at module level (not inside any procedure).
Public strMsg As String

命名空間範圍包含巢狀命名空間。 命名空間內可用的元素也可以從巢狀於該命名空間內的任何命名空間取得。

如果您的專案未包含任何 Namespace 語句,則專案中的所有項目都位於相同的命名空間中。 在此情況下,命名空間範圍可以視為項目範圍。 Public 模組、類別或結構中的元素也可供參考其專案的任何專案使用。

範圍選擇

當您宣告變數時,在選擇變數範圍時,應該記住下列幾點。

局部變數的優點

局部變數是任何類型的暫存計算的絕佳選擇,原因如下:

  • 避免名稱衝突 局部變數名稱不容易發生衝突。 例如,您可以建立數個不同的程式,其中包含稱為的 intTemp變數。 只要每個 intTemp 宣告為局部變數,每個程式就只會辨識它自己的版本 intTemp。 任何一個程式都可以改變其區域 intTemp 的值,而不會影響 intTemp 其他程式中的變數。

  • 記憶體耗用量。 局部變數只有在其程式正在執行時才會耗用記憶體。 當程序返回至呼叫的代碼時,其記憶體即會被釋放。 相較之下, 共用靜態 變數會耗用記憶體資源,直到您的應用程式停止執行為止,因此只有在需要時才使用這些資源。 實例變數 會在實例持續存在時取用記憶體,這使得它們比局部變數效率低,但可能比 SharedStatic 變數更有效率。

最小化範圍

一般而言,在宣告任何變數或常數時,讓範圍儘可能縮小是良好的程序設計做法(區塊範圍是最窄的)。 這有助於節省記憶體,並將程式代碼錯誤地參考錯誤變數的機會降到最低。 同樣地,只有在程式調用之間必須保留變數的值時,才應該將變數宣告為 Static

另請參閱