Shared (Visual Basic)

Especifica que uno o varios elementos de programación declarados están asociados a una clase o estructura en general y no con una instancia específica de la clase o estructura.

Cuándo usar Shared

Compartir un miembro de una clase o estructura hace que esté disponible para cada instancia, en lugar de no compartido, donde cada instancia conserva su propia copia. El uso compartido resulta útil, por ejemplo, si el valor de una variable se aplica a toda la aplicación. Si declara que la variable es Shared, todas las instancias acceden a la misma ubicación de almacenamiento, y si una instancia cambia el valor de la variable, todas las instancias acceden al valor actualizado.

El uso compartido no modifica el nivel de acceso de un miembro. Por ejemplo, un miembro de clase puede ser compartido y privado (accesible solo desde dentro de la clase) o no compartido y público. Para más información, consulte Niveles de acceso en Visual Basic.

Reglas

  • Contexto de declaración. Solo se puede usar Shared en un nivel de módulo. Esto significa que el contexto de declaración de un elemento Shared debe ser una clase o estructura y no puede ser un archivo de código fuente, un espacio de nombres o un procedimiento.

  • Modificadores combinados. No puede especificar Shared junto con Overrides, Overridable, NotOverridable, MustOverride o Static en la misma declaración.

  • Acceso. Para acceder a un elemento compartido, puede calificarlo con su nombre de clase o estructura, no con el nombre de variable de una instancia específica de su clase o estructura. Ni siquiera tiene que crear una instancia de una clase o estructura para acceder a sus miembros compartidos.

    En el ejemplo siguiente, se llama al procedimiento compartido IsNaN expuesto por la estructura Double.

    If Double.IsNaN(result) Then Console.WriteLine("Result is mathematically undefined.")
    
  • Uso compartido implícito. No puede usar el modificador Shared en una instrucción Const, pero las constantes se comparten implícitamente. De manera similar, no puede declarar un miembro de un módulo o una interfaz para que sea Shared, pero se comparten implícitamente.

Comportamiento

  • Almacenamiento. Una variable o evento compartido se almacena en memoria solo una vez, sin importar cuántas instancias cree de su clase o estructura. De manera similar, una propiedad o un procedimiento compartido solo contiene un conjunto de variables locales.

  • Acceso a través de una variable de instancia. Para acceder a un elemento compartido, puede calificarlo con el nombre de una variable que contiene una instancia específica de su clase o estructura. Aunque esto suele funcionar según lo esperado, el compilador genera un mensaje de advertencia y realiza el acceso a través del nombre de la estructura o la clase en lugar de la variable.

  • Acceso a través de una expresión de instancia. Si accede a un elemento compartido a través de una expresión que devuelve una instancia de su clase o estructura, el compilador realiza el acceso a través del nombre de la estructura o la clase en lugar de evaluar la expresión. Este acceso genera resultados inesperados si pretende que la expresión realice otras acciones, así como devolver la instancia. En el ejemplo siguiente, se ilustra esta situación.

    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
    

    En el ejemplo anterior, el compilador genera un mensaje de advertencia ambas veces que el código accede a la propiedad compartida Total a través de una instancia. En cada caso, realiza el acceso directamente a través de la clase ShareTotal y no hace uso de ninguna instancia. En el caso de la llamada prevista al procedimiento ReturnClass, esto significa que ni siquiera genera una llamada a ReturnClass, por lo que no se realiza la acción adicional de mostrar "Function ReturnClass() called".

El modificador Shared se puede utilizar en los contextos siguientes:

Consulte también