次の方法で共有


共有 (Visual Basic)

1 つ以上の宣言されたプログラミング要素が、クラスまたは構造体の特定のインスタンスではなく、大規模なクラスまたは構造体に関連付けられていることを指定します。

共有を使用する場合

クラスまたは構造体のメンバーを共有すると、各インスタンスが独自のコピーを保持する非 共有ではなく、すべてのインスタンスで使用できるようになります。 共有は、たとえば、変数の値がアプリケーション全体に適用される場合に便利です。 その変数を Shared宣言すると、すべてのインスタンスが同じストレージの場所にアクセスし、1 つのインスタンスが変数の値を変更すると、すべてのインスタンスが更新された値にアクセスします。

共有では、メンバーのアクセス レベルは変更されません。 たとえば、クラス メンバーは、共有とプライベート (クラス内からのみアクセス可能)、または非共有およびパブリックにすることができます。 詳細については、「 Visual Basic のアクセス レベル」を参照してください。

準則

  • 宣言コンテキスト。 Sharedはモジュール レベルでのみ使用できます。 つまり、 Shared 要素の宣言コンテキストはクラスまたは構造体である必要があり、ソース ファイル、名前空間、またはプロシージャにすることはできません。

  • 結合された修飾子。 同じ宣言で、オーバーライドオーバーライド可能NotOverridableMustOverride、または 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修飾子は、次のコンテキストで使用できます。

こちらも参照ください