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 elementoShared
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 seaShared
, 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 claseShareTotal
y no hace uso de ninguna instancia. En el caso de la llamada prevista al procedimientoReturnClass
, esto significa que ni siquiera genera una llamada aReturnClass
, 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:
- Instrucción Dim
- Event (Instrucción)
- Instrucción Function
- Operator Statement
- Property Statement
- Instrucción Sub