En Visual Basic, las estructuras se definen utilizando la palabra clave Structure. Ellas:
MustInherit (abstract) ni contener finalizadores;Public Structure Point Public X As Integer Public Y As Integer Public Sub New(x As Integer, y As Integer) Me.X = x Me.Y = y End Sub End Structure Dim p1 As New Point(1, 2) Dim p2 = p1 ' ¡Se copia el valor, no la referencia! p2.X = 5 ' p1.X = 1, p2.X = 5
P: ¿Cómo se comporta la estructura al pasarse a una función ByVal y ByRef? ¿Cuál es la diferencia con el paso de una clase?
R: Al pasar una estructura ByVal, se crea una copia de toda la estructura. Los cambios en la función no afectan al original. En ByRef, se modifica la variable original. A diferencia de las clases, que en cualquier paso (incluso ByVal) pasan una referencia, las estructuras se copian completamente en ByVal, lo que afecta el rendimiento y el comportamiento.
Sub MutateByVal(p As Point) p.X = 100 End Sub Sub MutateByRef(ByRef p As Point) p.X = 100 End Sub Dim s As New Point(3, 4) MutateByVal(s) ' s.X sigue siendo 3 MutateByRef(s) ' s.X ahora es 100
Historia
1. En un gran proyecto de biblioteca, se usaron estructuras para pasar grandes arreglos de datos a través de interfaces ByVal. Esto llevó a una disminución del rendimiento debido a la copia múltiple de grandes estructuras en la pila. Se resolvió el problema reemplazando estructuras por clases inmutables.
Historia
2. En un proyecto de desarrollo de GIS, hubo confusión al copiar estructuras que contenían campos de referencia: al modificar el arreglo dentro de la estructura, el desarrollador no esperaba que el original cambiara en todos los lugares donde se había copiado el arreglo, a pesar de ser “tipo de valor”.
Historia
**3. En un software de contabilidad, se mezclaron estructuras con clases para entidades de negocio: el intento de implementar herencia para una estructura resultó en un error de compilación, lo que llevó a reorganizar la arquitectura del sistema, lo que resultó laborioso debido a la elección inicial incorrecta entre estructuras y clases.