Estructuras y clases (Visual Basic)

Visual Basic unifica la sintaxis de estructuras y clases, con el resultado de que ambas entidades admiten la mayoría de las mismas características. No obstante, también hay diferencias importantes entre las estructuras y las clases.

Las clases tienen la ventaja de ser tipos de referencia: pasar una referencia es más eficaz que pasar una variable de estructura con todos sus datos. Por otro lado, las estructuras no requieren la asignación de memoria en el montón global.

Dado que no se puede heredar de una estructura, las estructuras solo se deben usar para los objetos que no tienen que ampliarse. Use estructuras cuando el objeto que desea crear tenga un tamaño de instancia pequeño y tenga en cuenta las características de rendimiento de las clases frente a las estructuras.

Similitudes

Las estructuras y las clases son similares en los siguientes aspectos:

  • Ambas son tipos de contenedores, lo que significa que contienen otros tipos como miembros.

  • Ambas tienen miembros que pueden incluir constructores, métodos, propiedades, campos, constantes, enumeraciones, eventos y controladores de eventos.

  • Los miembros de ambas pueden tener niveles de acceso individualizados. Por ejemplo, un miembro se puede declarar Public y otro Private.

  • En ambas se pueden implementar interfaces.

  • Ambas pueden tener constructores compartidos, con o sin parámetros.

  • Ambas pueden exponer una propiedad predeterminada, siempre que esa propiedad tome al menos un parámetro.

  • Ambas pueden declarar y generar eventos, y ambas pueden declarar delegados.

Diferencias

Las estructuras y las clases difieren en los siguientes aspectos:

  • Las estructuras son tipos de valor mientras que las clases son tipos de referencia. Una variable de un tipo de estructura contiene los datos de la estructura en lugar de contener una referencia a los datos como lo haría un tipo de clase.

  • Las estructuras usan la asignación de pila; las clases usan la asignación del montón.

  • Todos los elementos de una estructura son Public de forma predeterminada; las variables de clase y las constantes son Private de forma predeterminada, mientras que otros miembros de una clase son Public de forma predeterminada. Este comportamiento de los miembros de una clase proporciona compatibilidad con el sistema Visual Basic 6.0 de valores predeterminados.

  • Una estructura debe tener al menos una variable no compartida o un elemento de evento no compartido y no personalizado; una clase puede estar completamente vacía.

  • Los elementos de una estructura no se pueden declarar como Protected; los miembros de una clase sí pueden.

  • Un procedimiento de estructura solo puede controlar eventos si es un procedimiento CompartidoSub y solo por medio de la instrucción AddHandler; todos los procedimientos de una clase pueden controlar eventos mediante la palabra clave Handles o la instrucción AddHandler. Para más información, vea Eventos.

  • Las declaraciones de variables de estructura no pueden especificar inicializadores ni tamaños iniciales para matrices; las declaraciones de variables de clase sí pueden.

  • Las estructuras se heredan implícitamente de la clase System.ValueType y no pueden heredarse de ningún otro tipo; las clases se pueden heredar de cualquier clase que no sea System.ValueType.

  • Las estructuras no se pueden heredar; las clases sí.

  • Las estructuras nunca finalizan, por lo que Common Language Runtime (CLR) nunca llama al método Finalize en ninguna estructura; el recolector de elementos no utilizados, que llama a Finalize en una clase cuando detecta que no quedan referencias activas, es el que finaliza las clases.

  • Una estructura no requiere un constructor; una clase sí.

  • Las estructuras solo pueden tener constructores no compartidos si toman parámetros; las clases pueden tenerlas con o sin parámetros.

Cada estructura tiene un constructor público implícito sin parámetros. Este constructor inicializa todos los elementos de datos de la estructura a sus valores predeterminados. No se puede redefinir este comportamiento.

Instancias y variables

Dado que las estructuras son tipos de valor, cada variable de estructura se enlaza permanentemente a una instancia de estructura individual. Pero las clases son tipos de referencia y una variable de objeto puede hacer referencia a varias instancias de clase en momentos diferentes. Esta distinción afecta al uso de estructuras y clases de las siguientes maneras:

  • Inicialización. Una variable de estructura incluye implícitamente una inicialización de los elementos mediante el constructor sin parámetros de la estructura. Por tanto, Dim s As struct1 equivale a Dim s As struct1 = New struct1().

  • Asignación de variables. Al asignar una variable de estructura a otra, o pasar una instancia de estructura a un argumento de procedimiento, los valores actuales de todos los elementos de variable se copian en la nueva estructura. Cuando se asigna una variable de objeto a otra, o se pasa una variable de objeto a un procedimiento, solo se copia el puntero de referencia.

  • Asignación del valor Nothing. Puede asignar el valor Nothing a una variable de estructura, pero la instancia continuará asociada a la variable. Todavía puede llamar a sus métodos y acceder a sus elementos de datos, aunque la asignación reinicializará los elementos de la variable.

    Por el contrario, si establece una variable de objeto en Nothing, la desasocia de cualquier instancia de clase y no podrá acceder a ningún miembro a través de la variable hasta que asigne otra instancia a ella.

  • Varias instancias. Una variable de objeto puede tener diferentes instancias de clase asignadas en momentos diferentes y varias variables de objeto pueden hacer referencia a la misma instancia de clase al mismo tiempo. Los cambios que realiza en los valores de los miembros de la clase afectan a esos miembros cuando se accede a través de otra variable que apunta a la misma instancia.

    No obstante, los elementos de estructura están aislados dentro de su propia instancia. Los cambios en sus valores no se reflejan en ninguna otra variable de estructura ni incluso en otras instancias de la misma declaración Structure.

  • Igualdad. La prueba de igualdad de dos estructuras debe realizarse con una prueba elemento por elemento. Se pueden comparar dos variables de objeto mediante el método Equals. Equals indica si las dos variables apuntan a la misma instancia.

Consulte también