1 つ以上の宣言されたプログラミング要素が、クラスまたは構造体の特定のインスタンスではなく、大規模なクラスまたは構造体に関連付けられていることを指定します。
共有を使用する場合
クラスまたは構造体のメンバーを共有すると、各インスタンスが独自のコピーを保持する非 共有ではなく、すべてのインスタンスで使用できるようになります。 共有は、たとえば、変数の値がアプリケーション全体に適用される場合に便利です。 その変数を Shared
宣言すると、すべてのインスタンスが同じストレージの場所にアクセスし、1 つのインスタンスが変数の値を変更すると、すべてのインスタンスが更新された値にアクセスします。
共有では、メンバーのアクセス レベルは変更されません。 たとえば、クラス メンバーは、共有とプライベート (クラス内からのみアクセス可能)、または非共有およびパブリックにすることができます。 詳細については、「 Visual Basic のアクセス レベル」を参照してください。
準則
宣言コンテキスト。
Shared
はモジュール レベルでのみ使用できます。 つまり、Shared
要素の宣言コンテキストはクラスまたは構造体である必要があり、ソース ファイル、名前空間、またはプロシージャにすることはできません。結合された修飾子。 同じ宣言で、オーバーライド、オーバーライド可能、NotOverridable、MustOverride、または Static と共に
Shared
を指定することはできません。アクセス。 共有要素にアクセスする場合は、そのクラスまたは構造体の特定のインスタンスの変数名ではなく、クラス名または構造体名で修飾します。 共有メンバーにアクセスするために、クラスまたは構造体のインスタンスを作成する必要もありません。
次の例では、Double構造体によって公開IsNaN共有プロシージャを呼び出します。
If Double.IsNaN(result) Then Console.WriteLine("Result is mathematically undefined.")
暗黙的な共有。 Const ステートメントでは
Shared
修飾子を使用できませんが、定数は暗黙的に共有されます。 同様に、モジュールまたはインターフェイスのメンバーをShared
宣言することはできませんが、暗黙的に共有されます。
行動
ストレージ。 共有変数またはイベントは、クラスまたは構造体を作成するインスタンスの数や数に関係なく、1 回だけメモリに格納されます。 同様に、共有プロシージャまたはプロパティは、ローカル変数のセットを 1 つだけ保持します。
インスタンス変数を介したアクセス。 クラスまたは構造体の特定のインスタンスを含む変数の名前で修飾することで、共有要素にアクセスできます。 通常、これは期待どおりに動作しますが、コンパイラは警告メッセージを生成し、変数ではなくクラスまたは構造体名を介してアクセスします。
インスタンス式を介したアクセス。 クラスまたは構造体のインスタンスを返す式を使用して共有要素にアクセスする場合、コンパイラは式を評価する代わりに、クラスまたは構造体名を介してアクセスします。 このアクセスでは、インスタンスを返すだけでなく、他のアクションを実行する式を意図した場合は、予期しない結果が生成されます。 次の例は、この状況を示しています。
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
修飾子は、次のコンテキストで使用できます。
こちらも参照ください
.NET