Procedimentos de propriedade (Visual Basic)

Um procedimento de propriedade é uma série de instruções do Visual Basic que manipulam uma propriedade personalizada em um módulo, classe ou estrutura. Os procedimentos de propriedade também são conhecidos como acessadores de propriedade.

O Visual Basic fornece os seguintes procedimentos de propriedade:

  • Um procedimento Get retorna o valor de uma propriedade. Ele é chamado quando você acessa a propriedade em uma expressão.
  • Um procedimento Set define uma propriedade como valor, incluindo uma referência de objeto. Ele é chamado quando você atribui um valor à propriedade.

Normalmente, você define procedimentos de propriedade em pares, usando as instruções Get e Set, mas pode definir o procedimento isoladamente, se a propriedade for somente leitura (Get Statement) ou somente gravação (Set Statement).

Você pode omitir o procedimento e Set ao usar uma propriedade implementada Get automaticamente. Para obter mais informações, consulte Propriedades implementadas automaticamente.

Você pode definir propriedades em classes, estruturas e módulos. As propriedades são Public por padrão, o que significa que você pode chamá-las de qualquer lugar no aplicativo que possa acessar o contêiner da propriedade.

Para obter uma comparação de propriedades e variáveis, confira Diferenças entre propriedades e variáveis no Visual Basic.

Sintaxe da declaração

Uma própria propriedade é definida por um bloco de código entre a Property Statement e a instrução End Property. Dentro desse bloco, cada procedimento de propriedade aparece como um bloco interno delimitado dentro de uma instrução de declaração (Get ou Set) e a declaração End correspondente.

A sintaxe para declarar uma propriedade e os procedimentos é a seguinte:

[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]

A Modifiers pode especificar o nível de acesso e as informações sobre sobrecarga, substituição, compartilhamento e sombreamento, bem como se a propriedade é somente leitura ou somente gravação. O AccessLevel ou Get no procedimento Set pode ser qualquer nível mais restritivo do que o nível de acesso especificado para a própria propriedade. Para obter mais informações, confira Property Statement.

Tipo de Dados

O tipo de dados de uma propriedade e o nível de acesso da entidade de segurança são definidos na instrução Property, e não nos procedimentos de propriedade. Uma propriedade pode ter apenas um tipo de dados. Por exemplo, você não pode definir uma propriedade para armazenar um valor Decimal, mas recuperar um valor Double.

Nível de acesso

No entanto, você pode definir um nível de acesso da entidade de segurança para uma propriedade e restringir ainda mais o nível de acesso em um dos procedimentos de propriedade. Por exemplo, você pode definir uma propriedade Public e definir um procedimento Private Set. O procedimento Get permanece Public. Você pode alterar o nível de acesso em apenas um dos procedimentos de uma propriedade e só pode torná-lo mais restritivo do que o nível de acesso da entidade de segurança. Para obter mais informações, confira Instruções: declarar uma propriedade com níveis de acesso mistos.

Declaração de parâmetro

Você declarará cada parâmetro da mesma maneira que faz para Subprocedimentos, com exceção de que o mecanismo de passagem deve ser ByVal.

A sintaxe de cada parâmetro na lista de parâmetros é a seguinte:

[Optional] ByVal [ParamArray] parametername As datatype

Se o parâmetro for opcional, você também deverá fornecer um valor padrão como parte da declaração. A sintaxe para especificar um valor padrão é a seguinte:

Optional ByVal parametername As datatype = defaultvalue

Valor da propriedade

Em um procedimento Get, o valor de retorno é fornecido à expressão de chamada como o valor da propriedade.

Em um procedimento Set, o novo valor da propriedade é passado para o parâmetro da instrução Set. Se você declarar explicitamente um parâmetro, deverá declará-lo com o mesmo tipo de dados que a propriedade. Se você não declarar um parâmetro, o compilador usará o parâmetro implícito Value para representar o novo valor a ser atribuído à propriedade.

Sintaxe de chamada

Você invocará um procedimento de propriedade implicitamente, referenciando a propriedade. Use o nome da propriedade da mesma maneira que usaria o nome de uma variável, com exceção de que você deve fornecer valores para todos os argumentos que não são opcionais e colocar a lista de argumentos entre parênteses. Se não houver argumentos você pode, opcionalmente, omitir os parênteses.

A sintaxe de uma chamada implícita para um procedimento Set é a seguinte:

propertyname[(argumentlist)] = expression

A sintaxe de uma chamada implícita para um procedimento Get é a seguinte:

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

Ilustração de declaração e chamada

A propriedade a seguir armazena um nome completo como dois nomes constituintes, o nome e o sobrenome. Quando o código de chamada lê fullName, o procedimento Get combina os dois nomes constituintes e retorna o nome completo. Quando o código de chamada atribui um novo nome completo, o procedimento Set tenta dividi-lo em dois nomes constituintes. Se ele não encontrar um espaço, armazenará tudo como o nome.

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

O exemplo a seguir mostra chamadas típicas para os procedimentos de propriedade de fullName:

fullName = "MyFirstName MyLastName"
MsgBox(fullName)

Confira também