Shared (Visual Basic)

Mise à jour : novembre 2007

Spécifie que les éléments de programmation déclarés sont associés à une classe ou structure, et non à une instance spécifique de la classe ou structure.

Notes

Quand utiliser Shared

Le partage d'un membre d'une classe ou structure le rend disponible à chaque instance, contrairement à non partagé où chaque instance conserve sa propre copie. Par exemple, le fait que la valeur d'une variable s'applique à l'application entière est utile. Si vous déclarez la variable comme étant Shared, toutes les instances accéderont 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 n'altère 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 dans 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 d'un élément Shared doit être une classe ou une structure, et ne peut pas être un fichier source, un espace de noms, ou une procédure.

  • Modificateurs combinés. Vous ne pouvez pas spécifier Shared avec Overrides, Overridable, NotOverridable, MustOverride, ou Static (Visual Basic) dans la même déclaration.

  • Accès. Vous pouvez accéder à un élément partagé en le qualifiant avec son nom de classe ou de structure, non avec le nom de variable d'une instance spécifique de sa classe ou structure. Vous n'êtes même pas obligé de créer une instance d'une classe ou 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 MsgBox("Result is mathematically undefined.")

  • Partage implicite. Vous ne pouvez pas utiliser le modificateur Shared dans un Const, instruction (Visual Basic), mais les constantes sont partagées implicitement. De la même façon, vous ne pouvez pas déclarer un membre de module ou d'interface comme étant Shared, mais ils sont partagés implicitement.

Comportement

  • Stockage. Une variable ou un événement partagé est stocké une seule fois dans la mémoire, sans tenir compte du nombre d'instances de sa classe ou structure que vous créez. De la même façon, une procédure ou une propriété partagée contient seulement un jeu de variables locales.

  • Accès via une variable d'instance. Il est possible d'accéder à un élément partagé en le qualifiant avec le nom d'une variable qui contient une instance spécifique de sa classe ou structure. Bien que cette technique fonctionne normalement, le compilateur génère un message d'avertissement et autorise 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é via une expression qui retourne une instance de sa classe ou structure, le compilateur autorise l'accès via la classe ou le nom de structure au lieu d'évaluer l'expression. Des résultats inattendus se produisent, autres que l'exécution par l'expression d'autres actions ainsi que le retour de l'instance. L'exemple suivant illustre ce comportement :

    Sub main()
        shareTotal.total = 10
        ' The preceding line is the preferred way to access total.
        Dim instanceVar As New shareTotal
        instanceVar.total += 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(shareTotal.total))
    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
    

    Dans l'exemple précédent, le compilateur génère un message d'avertissement les deux fois que le code accède à la variable partagée total via une instance. Dans chaque cas, il autorise un accès direct via le shareTotal de classe et n'utilise aucune instance. Dans le cas où l'appel prévu au returnClass de la procédure se produit, il ne génère même pas d'appel à returnClass, donc l'action supplémentaire d'affichage de "Function returnClass() called" n'est pas exécutée.

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

Dim, instruction

Event, instruction

Function, instruction

Operator, instruction

Property, instruction

Sub, instruction

Voir aussi

Concepts

Durée de vie dans Visual Basic

Procédures dans Visual Basic

Membres partagés en Visual Basic

Référence

Shadows

Static (Visual Basic)

Autres ressources

Structures constituées à partir de vos propres types de données

Présentation des classes