Shared (Visual Basic)

Spécifie qu’un ou plusieurs éléments de programmation déclarés sont associés à une classe ou une structure en grande partie, et non à une instance spécifique de la classe ou de la structure.

Quand utiliser partagé

Le partage d’un membre d’une classe ou d’une structure le rend disponible pour chaque instance, plutôt que non partagée, où chaque instance conserve sa propre copie. Le partage est utile, par exemple, si la valeur d’une variable s’applique à l’ensemble de l’application. Si vous déclarez que cette variable doit être Shared, toutes les instances accèdent au même emplacement de stockage et si une instance modifie la valeur de la variable, toutes les instances accèdent à la valeur mise à jour.

Le partage ne modifie pas le niveau d’accès d’un membre. Par exemple, un membre de classe peut être partagé et privé (accessible uniquement à partir de la classe), ou non partagé et public. Pour plus d’informations, consultez Niveaux d’accès en Visual Basic.

Règles

  • Contexte de déclaration. Vous pouvez utiliser Shared seulement au niveau du module. Cela signifie que le contexte de déclaration pour un élément Shared doit être un fichier source, un espace de noms, une interface, un module, une classe ou une interface, et ne peut pas être une procédure.

  • Modificateurs combinés. Vous ne pouvez pas spécifier Shared avec des Remplacements, des Substituables, NotOverridable, MustOverrideou Statiques dans la même déclaration.

  • Accès. Vous accédez à un élément partagé en le qualifier avec son nom de classe ou de structure, et non avec le nom de variable d’une instance spécifique de sa classe ou de sa structure. Vous n’avez même pas besoin de créer une instance d’une classe ou d’une structure pour accéder à ses membres partagés.

    L’exemple suivant appelle la procédure IsNaN partagée exposée par la structure Double.

    If Double.IsNaN(result) Then Console.WriteLine("Result is mathematically undefined.")
    
  • Partage implicite. Vous ne pouvez pas utiliser le modificateur Shared dans une instruction Const, mais les constantes sont implicitement partagées. De même, vous ne pouvez pas déclarer un membre d’un module ou une interface à être Shared, mais ils sont implicitement partagés.

Comportement

  • Stockage. Une variable ou un événement partagé est stocké en mémoire une seule fois, quel que soit le nombre ou le nombre d’instances que vous créez de sa classe ou de sa structure. De même, une procédure partagée ou une propriété ne contient qu’un seul ensemble de variables locales.

  • Accès via une variable d’instance. Il est possible d’accéder à un élément partagé en le qualifier avec le nom d’une variable qui contient une instance spécifique de sa classe ou de sa structure. Bien que cela fonctionne généralement comme prévu, le compilateur génère un message d’avertissement et rend l’accès via la classe ou le nom de structure au lieu de la variable.

  • Accès via une expression d’instance. Si vous accédez à un élément partagé par le biais d’une expression qui retourne une instance de sa classe ou de sa structure, le compilateur rend l’accès via le nom de la classe ou de la structure au lieu d’évaluer l’expression. Cet accès produit des résultats inattendus si vous avez prévu que l’expression effectue d’autres actions et retourne l’instance. L’exemple suivant illustre la situation.

    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
    

    Dans l’exemple précédent, le compilateur génère un message d’avertissement chaque fois que le code accède à la propriété Total partagée via une instance. Dans chaque cas, il rend l’accès directement via la classe ShareTotal et n’utilise aucune instance. Dans le cas de l’appel prévu à la procédure ReturnClass, cela signifie qu’il ne génère même pas d’appel à ReturnClass, de sorte que l’action supplémentaire d’affichage de « Function ReturnClass() appelée » n’est pas effectuée.

Le modificateur Shared peut être utilisé dans les contextes suivants :

Voir aussi