Procedimientos de propiedad (Visual Basic)

Un procedimiento de propiedad es una serie de instrucciones de Visual Basic que manipulan una propiedad personalizada en un módulo, una clase o una estructura. Los procedimientos de propiedad también se conocen como descriptores de acceso de propiedad.

Visual Basic proporciona los siguientes procedimientos de propiedad:

  • Un procedimiento Get devuelve el valor de una propiedad. Se le llama cuando se accede a la propiedad en una expresión.
  • Un procedimiento Set establece una propiedad en un valor, incluida una referencia de objeto. Se le llama cuando se asigna un valor a la propiedad.

Normalmente, los procedimientos de propiedad se definen en pares, con las instrucciones Get y Set, pero se puede definir cada procedimiento independientemente si la propiedad es de solo lectura (Get (Instrucción)) o de solo escritura (Instrucción Set).

Los procedimientos Get y Set se pueden omitir si se usa una propiedad implementada automáticamente. Para obtener más información, vea Propiedades implementadas automáticamente.

Puede definir propiedades en clases, estructuras y módulos. Las propiedades son Public de manera predeterminada, lo que significa que se las puede llamar desde cualquier lugar de la aplicación que pueda acceder al contenedor de la propiedad.

Para revisar una comparación de propiedades y variables, vea Diferencias entre propiedades y variables en Visual Basic.

Sintaxis de declaración

Una propiedad se define mediante un bloque de código incluido entre Property (instrucción) y la instrucción End Property. Dentro de este bloque, cada procedimiento de propiedad aparece como un bloque interno incluido en una instrucción de declaración (Get o Set) y la declaración End correspondiente.

La sintaxis para declarar una propiedad y sus procedimientos es la siguiente:

[Default] [Modifiers] Property PropertyName[(ParameterList)] [As DataType]
    [AccessLevel] Get
        ' Statements of the Get procedure.
        ' The following statement returns an expression as the property's value.
        Return Expression
    End Get
    [AccessLevel] Set[(ByVal NewValue As DataType)]
        ' Statements of the Set procedure.
        ' The following statement assigns newvalue as the property's value.
        LValue = NewValue
    End Set
End Property
' - or -
[Default] [Modifiers] Property PropertyName [(ParameterList)] [As DataType]

Los elementos Modifiers pueden especificar el nivel de acceso e información relacionada con la sobrecarga, la invalidación, el uso compartido y el sombreado, así como si la propiedad es de solo lectura o de solo escritura. El elemento AccessLevel del procedimiento Get o Set puede ser cualquier nivel más restrictivo que el nivel de acceso especificado en la propia propiedad. Para obtener más información, vea Property (instrucción).

Tipo de datos

El tipo de datos de una propiedad y el nivel de acceso principal se definen en la instrucción Property, no en los procedimientos de propiedad. Una propiedad solo puede tener un tipo de datos. Por ejemplo, no se puede definir una propiedad que almacene un valor Decimal pero recupere un valor Double.

Nivel de acceso

Pero se puede definir un nivel de acceso principal en una propiedad y restringir aún más el nivel de acceso en uno de sus procedimientos de propiedad. Por ejemplo, puede definir una propiedad Public y luego un procedimiento Private Set. El procedimiento Get sigue siendo Public. Puede cambiar el nivel de acceso en solo uno de los procedimientos de una propiedad, y solo puede hacer que sea más restrictivo que el nivel de acceso principal. Para obtener más información, vea Procedimiento para declarar una propiedad con niveles de acceso mixtos.

Declaración de parámetros

Cada parámetro se declara de la misma manera que los Subprocedimientos, salvo que el mecanismo de paso debe ser ByVal.

La sintaxis de cada parámetro de la lista de parámetros es la siguiente:

[Optional] ByVal [ParamArray] parametername As datatype

Si el parámetro es opcional, también debe proporcionar un valor predeterminado como parte de su declaración. La sintaxis para especificar un valor predeterminado es la siguiente:

Optional ByVal parametername As datatype = defaultvalue

Valor de propiedad

En un procedimiento Get, el valor devuelto se proporciona a la expresión de llamada como valor de la propiedad.

En un procedimiento Set, el nuevo valor de propiedad se pasa al parámetro de la instrucción Set. Si declara explícitamente un parámetro, debe declararlo con el mismo tipo de datos que la propiedad. Si no declara un parámetro, el compilador usa el parámetro implícito Value para representar el nuevo valor que se va a asignar a la propiedad.

Sintaxis de llamada

Para invocar a un procedimiento de propiedad de forma implícita, haga referencia a la propiedad. Use el nombre de la propiedad de la misma manera que usaría el nombre de una variable, salvo que debe proporcionar valores para todos los argumentos que no son opcionales y debe incluir la lista de argumentos entre paréntesis. Si no se proporciona ningún argumento, opcionalmente se pueden omitir los paréntesis.

La sintaxis de una llamada implícita a un procedimiento Set es la siguiente:

propertyname[(argumentlist)] = expression

La sintaxis de una llamada implícita a un procedimiento Get es la siguiente:

lvalue = propertyname[(argumentlist)]
Do While (propertyname[(argumentlist)] > expression)

Ilustración de declaración y llamada

La propiedad siguiente almacena un nombre completo como dos nombres constituyentes, el nombre y el apellido. Cuando el código de llamada lee fullName, el procedimiento Get combina los dos nombres constituyentes y devuelve el nombre completo. Cuando el código de llamada asigna un nuevo nombre completo, el procedimiento Set intenta dividirlo en dos nombres constituyentes. Si no encuentra un espacio, lo almacena todo como nombre.

Dim firstName, lastName As String
Property fullName() As String
    Get
      If lastName = "" Then
          Return firstName
      Else
          Return firstName & " " & lastName
      End If

    End Get
    Set(ByVal Value As String)
        Dim space As Integer = Value.IndexOf(" ")
        If space < 0 Then
            firstName = Value
            lastName = ""
        Else
            firstName = Value.Substring(0, space)
            lastName = Value.Substring(space + 1)
        End If
    End Set
End Property

En el ejemplo siguiente se muestran llamadas típicas a los procedimientos de propiedad de fullName:

fullName = "MyFirstName MyLastName"
MsgBox(fullName)

Consulte también