Shared (Visual Basic)Shared (Visual Basic)

1つ以上の宣言されたプログラミング要素が、クラスまたは構造体の特定のインスタンスではなく、大規模なクラスまたは構造体に関連付けられていることを指定します。Specifies that one or more declared programming elements are associated with a class or structure at large, and not with a specific instance of the class or structure.


共有を使用する場合When to Use Shared

クラスまたは構造体のメンバーを共有すると、共有ではなく、すべてのインスタンスで使用できるようになります。この場合、各インスタンスは独自のコピーを保持します。Sharing a member of a class or structure makes it available to every instance, rather than nonshared, where each instance keeps its own copy. これは、変数の値がアプリケーション全体に適用される場合などに便利です。This is useful, for example, if the value of a variable applies to the entire application. この変数を Sharedするように宣言すると、すべてのインスタンスが同じストレージの場所にアクセスし、1つのインスタンスが変数の値を変更すると、すべてのインスタンスが更新された値にアクセスします。If you declare that variable to be Shared, then all instances access the same storage location, and if one instance changes the variable's value, all instances access the updated value.

共有によってメンバーのアクセスレベルが変更されることはありません。Sharing does not alter the access level of a member. たとえば、クラスメンバーは、共有およびプライベート (クラス内からのみアクセス可能)、または非共有およびパブリックにすることができます。For example, a class member can be shared and private (accessible only from within the class), or nonshared and public. 詳細については、「Visual Basic でのアクセス レベル」を参照してください。For more information, see Access levels in Visual Basic.


  • 宣言コンテキスト。Declaration Context. Shared は、モジュール レベルでのみ使用できます。You can use Shared only at module level. つまり、Shared 要素の宣言コンテキストは、クラスまたは構造体である必要があり、ソースファイル、名前空間、またはプロシージャにすることはできません。This means the declaration context for a Shared element must be a class or structure, and cannot be a source file, namespace, or procedure.

  • 修飾子の結合。Combined Modifiers. 同じ宣言で、OverridesOverridableNotOverridableMustOverride、またはStatic と共に Shared を指定することはできません。You cannot specify Shared together with Overrides, Overridable, NotOverridable, MustOverride, or Static in the same declaration.

  • **アクセス。Accessing. ** 共有要素には、そのクラスまたは構造体の特定のインスタンスの変数名ではなく、そのクラスまたは構造体の名前を修飾することによってアクセスします。You access a shared element by qualifying it with its class or structure name, not with the variable name of a specific instance of its class or structure. クラスまたは構造体のインスタンスを作成しなくても、その共有メンバーにアクセスできます。You do not even have to create an instance of a class or structure to access its shared members.

    次の例では、Double 構造によって公開される IsNaN 共有プロシージャを呼び出します。The following example calls the shared procedure IsNaN exposed by the Double structure.

    If Double.IsNaN(result) Then MsgBox("Result is mathematically undefined.")

  • 暗黙の共有。Implicit Sharing. Const ステートメントでは Shared 修飾子を使用できませんが、定数は暗黙的に共有されます。You cannot use the Shared modifier in a Const Statement, but constants are implicitly shared. 同様に、モジュールまたはインターフェイスのメンバーを Sharedするように宣言することはできませんが、暗黙的に共有されます。Similarly, you cannot declare a member of a module or an interface to be Shared, but they are implicitly shared.


  • **ストレージ。Storage. ** 共有変数またはイベントは、クラスまたは構造体に生成されたインスタンスの数に関係なく、メモリに 1 回だけ格納されます。A shared variable or event is stored in memory only once, no matter how many or few instances you create of its class or structure. 同様に、共有プロシージャまたはプロパティは、ローカル変数のセットを 1 つだけ保持します。Similarly, a shared procedure or property holds only one set of local variables.

  • インスタンス変数を使用したアクセス。Accessing through an Instance Variable. 共有要素にアクセスするには、そのクラスまたは構造体の特定のインスタンスを含む変数の名前を指定します。It is possible to access a shared element by qualifying it with the name of a variable that contains a specific instance of its class or structure. これは通常、想定どおりに動作しますが、コンパイラは警告メッセージを生成し、変数ではなくクラスまたは構造体の名前を使用してアクセスを行います。Although this usually works as expected, the compiler generates a warning message and makes the access through the class or structure name instead of the variable.

  • インスタンス式を使用したアクセス。Accessing through an Instance Expression. クラスまたは構造体のインスタンスを返す式を使用して共有要素にアクセスする場合、コンパイラは式を評価するのではなく、クラスまたは構造体の名前を使用してアクセスを行います。If you access a shared element through an expression that returns an instance of its class or structure, the compiler makes the access through the class or structure name instead of evaluating the expression. これにより、他のアクションを実行するための式を作成する場合や、インスタンスを返す場合に、予期しない結果が発生します。This produces unexpected results if you intended the expression to perform other actions as well as returning the instance. これを次の例に示します。The following example illustrates this.

    Sub main()  = 10  
        ' The preceding line is the preferred way to access total.  
        Dim instanceVar As New shareTotal  += 100  
        ' The preceding 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.  
        returnClass().total += 1000  
        ' The preceding 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 MsgBox in returnClass() does not run.  
        MsgBox("Value of total is " & CStr(  
    End Sub  
    Public Function returnClass() As shareTotal  
        MsgBox("Function returnClass() called")  
        Return New shareTotal  
    End Function  
    Public Class shareTotal  
        Public Shared total As Integer  
    End Class  

    前の例では、コードがインスタンスを介して total 共有変数にアクセスするときに、コンパイラによって警告メッセージが生成されます。In the preceding example, the compiler generates a warning message both times the code accesses the shared variable total through an instance. 各ケースでは、クラス shareTotal を通じて直接アクセスを行い、インスタンスを使用しません。In each case it makes the access directly through the class shareTotal and does not make use of any instance. このプロシージャ returnClassの呼び出しの場合、これは returnClassの呼び出しを生成しないことを意味するため、"関数 returnClass ()" を表示する追加のアクションは実行されません。In the case of the intended call to the procedure returnClass, this means it does not even generate a call to returnClass, so the additional action of displaying "Function returnClass() called" is not performed.

Shared 修飾子は、次のコンテキストで使用できます。The Shared modifier can be used in these contexts:

Dim ステートメントDim Statement

Event ステートメントEvent Statement

Function ステートメントFunction Statement

Operator ステートメントOperator Statement

Property ステートメントProperty Statement

Sub ステートメントSub Statement

参照See also