En Visual Basic, una propiedad (Property) se puede declarar de dos maneras:
' Propiedad automática Public Property Name As String ' Propiedad completa Private _age As Integer Public Property Age As Integer Get Return _age End Get Set(value As Integer) If value < 0 Then Throw New ArgumentException("La edad no puede ser negativa") _age = value End Set End Property
Matices al usar Set:
Value es una pseudo-variable que hace referencia al valor asignado.Set se pueden realizar validaciones, registro, activación de eventos.Cuándo usar:
¿Cuáles son los problemas al escribir
Set(ByVal value As Integer)en lugar deSet(value As Integer)en VB.NET? ¿Por qué no se debe escribir así?
Respuesta:
La sintaxis de VB.NET no requiere (y no soporta) la declaración del parámetro ByVal explícitamente en Set — simplemente use Set(value As Type). Si se escribe Set(ByVal value As Integer), causará un error de compilación.
Ejemplo de código erróneo:
'Set(ByVal value As Integer) — error de compilación Public Property Prop As Integer Set(ByVal value As Integer) ... End Set End Property
En VB6 clásico, tal sintaxis era válida, pero en VB.NET se requiere estrictamente Set(value As Type).
Historia
ByVal en Set — el compilador daba errores misteriosos que no se podían localizar, ya que el linter no mostraba una razón clara.Historia
Historia
Al copiar objetos de tipo por referencia a través de propiedades automáticas, se olvidó implementar una copia profunda a través de Get/Set. Como resultado, se obtenían duplicados de referencias al mismo objeto; los cambios en una instancia causaban cambios en otra.