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 a una instancia específica de la clase o estructura.

Cuándo usar Compartido

Compartir un miembro de una clase o estructura hace que esté disponible para todas las instancias, en lugar de no compartidas, donde cada instancia mantiene su propia copia. El uso compartido es útil, por ejemplo, si el valor de una variable se aplica a toda la aplicación. Si declara que esa variable es , todas las instancias tienen acceso a la misma ubicación de almacenamiento y, si una instancia cambia el valor de la variable, todas las instancias tienen acceso al Shared 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 obtener más información, vea 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 debe ser una clase o estructura, y no puede ser un archivo de origen, un espacio Shared de nombres o un procedimiento.

  • Modificadores combinados. No se puede Shared especificar junto con Overrides, Overridable, NotOverible, MustOverrideo Static en la misma declaración.

  • Acceso. Para acceder a un elemento compartido, debe 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 tener acceso a sus miembros compartidos.

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

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

Comportamiento

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

  • Acceso a través de una variable de instancia. Es posible acceder a un elemento compartido al calificarlo con el nombre de una variable que contiene una instancia específica de su clase o estructura. Aunque normalmente funciona según lo previsto, el compilador genera un mensaje de advertencia y hace que el acceso se haga a través del nombre de clase o estructura en lugar de la variable .

  • Acceso a través de una expresión de instancia. Si tiene acceso 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 clase o estructura en lugar de evaluar la expresión. Este acceso genera resultados inesperados si se pretende que la expresión realice otras acciones, así como devolver la instancia. En el ejemplo siguiente se muestra 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 cada vez que el código accede a la propiedad compartida a Total través de una instancia de . 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 , esto significa que ni siquiera genera una llamada a , por lo que no se realiza la acción adicional de mostrar ReturnClass ReturnClass "Function ReturnClass() called".

El modificador Shared se puede utilizar en los contextos siguientes:

Consulta también