Visual Basic 中的範圍
宣告項目範圍是一組可參考項目的所有程式碼,而不需要限定其名稱,或透過 Imports 陳述式 (.NET 命名空間與類型) 來提供使用。 項目可以有下列其中一個層級的範圍:
層級 | 描述 |
---|---|
區塊範圍 | 只能在宣告範圍的程式碼區塊內使用 |
程序範圍 | 適用於宣告所在程序內的所有程式碼 |
模組範圍 | 適用於宣告所在模組、類別或結構內的所有程式碼 |
命名空間範圍 | 適用於宣告所在命名空間中的所有程式碼 |
這些範圍層級會從最窄 (區塊) 到最寬 (命名空間) 來進行,其中最窄的範圍表示可參考項目且不具資格的一組最小程式代碼。 如需詳細資訊,請參閱此頁面上的「範圍層級」。
指定範圍和定義變數
當您宣告項目時,需要指定項目的範圍。 範圍可能取決於下列因素:
您要在其中宣告項目的區域 (區塊、程序、模組、類別或結構)
包含項目宣告的命名空間
您為項目宣告的存取層級
當您以相同名稱但不同範圍來定義變數時,請小心,因為這麼做可能會導致非預期的結果。 如需詳細資訊,請參閱 References to Declared Elements。
範圍層級
您可以在宣告程式設計項目的整個區域中使用程式設計項目。 相同區域中的所有程式碼無須限定項目名稱即可參考該項目。
區塊範圍
區塊是包含在起始和終止宣告陳述式內的一組陳述式,例如:
Do
和Loop
For
[Each
] 和Next
If
和End If
Select
和End Select
SyncLock
和End SyncLock
Try
和End Try
While
和End While
With
和End With
如果您在區塊內宣告變數,則只能在該區塊內使用變數。 在下列範例中,整數變數 cube
的範圍是 If
和 End If
之間的區塊,且當執行超出該區塊時,您無法再參考 cube
。
If n < 1291 Then
Dim cube As Integer
cube = n ^ 3
End If
注意
即使變數的範圍僅限於區塊,其存留期仍是整個程序的存留期。 如果您在程序期間多次輸入區塊,則每個區塊變數都會保留其先前的值。 為了避免此類情況發生非預期的結果,最好在區塊開頭初始化區塊變數。
程序範圍
在程序內宣告的項目無法在該程序之外使用。 只有包含宣告的程序才能使用項目。 此層級的變數也稱為區域變數。 您可以使用 Dim 陳述式來宣告變數,但不含 Static 關鍵字。
程序和區塊範圍密切相關。 如果您在程序內宣告變數,但在該程序內的任何區塊之外,則可以將變數視為具有區塊範圍,其中區塊即為整個程序。
注意
即使本機項目是 Static
變數,所有本機項目都是其出現所在的程序所專用。 您無法在程序中使用 Public 關鍵字來宣告任何項目。
模組範圍
為了方便起見,單一詞彙模組層級同樣適用於模組、類別和結構。 您可以將宣告陳述式放在任何程序或區塊之外,但放在模組、類別或結構內,以在此層級宣告項目。
當您在模組層級進行宣告時,您選擇的存取層級會決定範圍。 包含模組、類別或結構的命名空間也會影響範圍。
您宣告 Private 存取層級的項目可供該模組中的每個程序使用,但不適用於不同模組中的任何程式碼。 如果您未使用任何存取層級關鍵字,模組層級上的 Dim
陳述式預設為 Private
。 不過,您可以使用 Dim
陳述式中的 Private
關鍵字,讓範圍和存取層級更加明顯。
在下列範例中,模組中定義的所有程序都可以參考字串變數 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
命名空間範圍
如果您使用 Friend 或 Public 關鍵字在模組層級宣告項目,則會變成可供宣告項目命名空間中的所有程序使用。 在對上述範例進行下列變更之下,可以在其宣告命名空間中的任何位置透過程式碼參考字串變數 strMsg
。
' Include this declaration at module level (not inside any procedure).
Public strMsg As String
命名空間範圍包含巢狀命名空間。 命名空間內可用的項目也可以從該命名空間內巢狀的任何命名空間內取得。
如果您的專案不包含任何 Namespace 陳述式,則專案中的所有項目都位於相同的命名空間中。 在此情況下,命名空間範圍可以視為專案範圍。 Public
模組、類別或結構中的項目也可供參考其專案的任何專案使用。
範圍選取
當您宣告變數時,在選擇變數範圍時,您應該記住下列幾點。
區域變數的優點
區域變數是任何暫存計算種類的好選擇,原因如下:
名稱衝突避免。 區域變數名稱不會受到衝突的影響。 例如,您可以建立數個不同的程序,其中包含名為
intTemp
的變數。 只要每個intTemp
宣告為區域變數,每個程序都會只辨識自己的intTemp
版本。 任何一個程序都可以在其本機intTemp
變更值,而不會影響其他程式中的intTemp
變數。記憶體使用量。 區域變數只有在執行其程序時才會耗用記憶體。 當程序傳回呼叫程式碼時,就會釋放其記憶體。 相反地,Shared 和 Static 變數會耗用記憶體資源,直到您的應用程式停止執行為止,因此請僅在必要時才使用這些變數。 執行個體變數會在執行個體持續存在時耗用記憶體,使其效率低於區域變數,但可能比
Shared
或Static
變數更有效率。
最小化範圍
一般而言,宣告任何變數或常數時,良好的程式設計做法是讓範圍盡可能縮小 (區塊範圍是最窄的)。 這有助於節省記憶體,並將程式碼錯誤地參考錯誤變數的機會降到最低。 同樣地,只有在程序呼叫之間必須保留其值時,才應該將變數宣告為 Static。