Shared (Visual Basic)
指定一或多個宣告的程式設計元素與大型類別或結構相關聯,而不是與類別或結構的特定執行個體相關聯。
使用共用的時機
共用類別或結構的成員可讓每個執行個體都能使用,這與非共用不同,後者的每個執行個體都會保留各自的複本。 舉例來說,如果變數的值適用於整個應用程式,共用就非常實用。 如果您宣告該變數為Shared
,則所有執行個體都會存取相同的儲存體位置;如果一個執行個體變更變數的值,則所有執行個體都會存取更新後的值。
共用不會改變成員的存取層級。 例如,類別成員可以為共用和私用 (只能在類別中存取),或為非共用和公用。 如需詳細資訊,請參閱 Visual Basic 中的存取層級。
規則
宣告內容。 您只能在模組層級使用
Shared
。 這表示Shared
元素的宣告內容必須是類別或結構,且不能是來源檔案、命名空間或程序。合併的修飾元。 您無法在相同的宣告中,與 Overrides、Overridable、NotOverridable、MustOverride 或 Static 一起指定
Shared
。存取。 您可以使用共用元素的類別或結構名稱,而非其類別或結構的特定執行個體變數名稱來存取該共用元素。 您甚至不需要建立類別或結構的執行個體,就能存取共用成員。
下列範例會呼叫 Double 結構所公開的共用程序 IsNaN。
If Double.IsNaN(result) Then Console.WriteLine("Result is mathematically undefined.")
隱含共用。 您無法在 Const 陳述式中使用
Shared
修飾元,但常數為隱含共用。 同樣地,您無法將模組或介面的成員宣告為Shared
,但它們為隱含共用。
行為
儲存空間。 共用變數或事件只會儲存在記憶體中一次,無論您為其類別或結構建立多少執行個體皆不影響。 同樣地,共用程序或屬性只會保留一組區域變數。
透過執行個體變數存取。 您可以使用包含其類別或結構之特定執行個體的變數名稱來限定共用元素,以存取該共用元素。 雖然這通常會如預期般運作,但編譯器會產生警告訊息,並透過類別或結構名稱 (而非變數) 進行存取。
透過執行個體運算式存取。 如果您透過可傳回類別或結構的執行個體運算式存取共用元素,編譯器會透過類別或結構名稱進行存取,而非評估運算式。 如果您期望運算式執行其他動作及傳回執行個體,此存取會產生非預期的結果。 下列範例可說明此情況。
Sub Main() ' The following line is the preferred way to access Total. ShareTotal.Total = 10 ' The following line generates a compiler warning message and ' accesses total through class ShareTotal instead of through ' the variable instanceVar. This works as expected and adds ' 100 to Total. Dim instanceVar As New ShareTotal instanceVar.Total += 100 ' The following line generates a compiler warning message and ' accesses total through class ShareTotal instead of calling ' ReturnClass(). This adds 1000 to total but does not work as ' expected, because the WriteLine in ReturnClass() does not run. Console.WriteLine("Value of total is " & CStr(ShareTotal.Total)) ReturnClass().Total += 1000 End Sub Public Function ReturnClass() As ShareTotal Console.WriteLine("Function ReturnClass() called") Return New ShareTotal End Function Public Class ShareTotal Public Shared Property Total As Integer End Class
在上述範例中,編譯器會在程式碼透過執行個體存取共用屬性
Total
時產生兩次警告訊息。 在每個案例中,系統會直接透過類別ShareTotal
進行存取,而且不會使用任何執行個體。 在預期呼叫程序ReturnClass
的情況下,這表示系統甚至不會產生對ReturnClass
的呼叫,因此不會執行顯示 「Function ReturnClass() called」 的額外動作。
Shared
修飾詞可用於以下內容: