ProgramaciónDesarrollador VB/VB.NET

¿Cómo implementar tipos de datos definidos por el usuario (User-Defined Types, UDTs) en Visual Basic, y en qué casos deberían usarse en lugar de clases?

Supere entrevistas con el asistente de IA Hintsage

Respuesta

En Visual Basic, los tipos de datos definidos por el usuario ( Type en VB6 o Structure en VB.NET) permiten definir tus propios tipos compuestos, que incluyen múltiples variables de diferentes tipos. Esto es conveniente para empaquetar datos relacionados.

UDTs (VB6):

Type Person Name As String Age As Integer Height As Single End Type Dim employee As Person employee.Name = "Alexey" employee.Age = 32 employee.Height = 1.85

Estructuras (VB.NET):

Structure Person Public Name As String Public Age As Integer Public Height As Single End Structure Dim employee As Person employee.Name = "Alexey"

Cuándo usar:

  • Para contenedores de datos livianos sin lógica
  • Cuando el rendimiento es importante (las estructuras se crean en la pila)
  • Si no se necesita funcionalidad heredable: las estructuras no soportan herencia

En contraste: Las clases se utilizan si se necesita encapsulación de lógica, herencia, polimorfismo o implementación de interfaces.

Pregunta capciosa

¿Por qué no se pueden asignar valores Nothing a las estructuras en VB.NET?

Respuesta: Solo a las variables de clase (objetos) se les puede asignar Nothing, ya que almacenan referencias. Las estructuras son value-type, siempre contienen un conjunto de valores; intentar asignar Nothing resultará en un error de compilación.

Dim s As Person = Nothing '¡Error! Las estructuras no pueden ser Nothing (excepto Nullable(Of T))

Ejemplos de errores reales debido al desconocimiento de las sutilezas del tema


Historia

En un viejo proyecto, decidieron reemplazar un array de primitivos por una estructura con múltiples campos, pero el nuevo código se volvió inusualmente más lento. Resultó que la estructura era muy grande y se copiaba a menudo en funciones. Si hubieran usado una clase, solo se habrían copiado referencias y no la estructura completa.


Historia

Después de portar UDT de VB6 a VB.NET, uno de los desarrolladores no implementó la interfaz ISerializable para la estructura en la llamada remota. Como resultado, el objeto remoto no pudo ser serializado, lo que causó fallos en la comunicación entre procesos.


Historia

En un módulo para trabajar con geometría, la estructura almacenaba referencias a arrays (mutable). Múltiples instancias de esta estructura llevaban a efectos inesperados, ya que las referencias dentro de la estructura apuntaban a los mismos arrays de datos: ¡las mutaciones se reflejaban en todas las copias!