Ir para o conteúdo

O With

Introdução

Para acelerar o desenvolvimento, o VB 2008 possuí uma série de atalhos que nos permitem reduzir a quantidade de linhas ou repetições o que aumenta a legibilidade do código e consequentemente aumenta a facilidade de manutenção. Um dos atalhos mais úteis é sem dúvida o With.

Em repetições

Podemos utilizar o With quando nos queremos referenciar várias vezes à mesma instancia, por exemplo.

        Dim Botao As New Button

        With Botao
            .Visible = True
            .Top = 0
            .Left = 0
            .BackColor = Color.Aqua
            .Text = "O meu botão"
        End With

Ideia: Também o podemos fazer sem o ponto no início para melhorar a legibilidade.

A sua utilidade torna-se mais evidente em situações como esta:

Sem With:

        Dim Ano As Integer = My.Computer.Clock.LocalTime.Year
        Dim Mes As Integer = My.Computer.Clock.LocalTime.Month
        Dim Dia As Integer = My.Computer.Clock.LocalTime.Day
        Dim Hora As Integer = My.Computer.Clock.LocalTime.Hour
        Dim Minuto As Integer = My.Computer.Clock.LocalTime.Minute
        Dim Segundo As Integer = My.Computer.Clock.LocalTime.Second

Com With:

        With My.Computer.Clock.LocalTime
            Dim Ano As Integer = .Year
            Dim Mes As Integer = .Month
            Dim Dia As Integer = .Day
            Dim Hora As Integer = .Hour
            Dim Minuto As Integer = .Minute
            Dim Segundo As Integer = .Second
        End With

O With não serve apenas para atribuições directas. Pode ser usado em qualquer situação, por exemplo:

        Dim OFD As New OpenFileDialog

        With OFD
            .Title = "Abrir ficheiro"
            .Filter = "ZugZug|zug??.zag"

            If .ShowDialog() = Windows.Forms.DialogResult.Cancel Then
                .Title = "Mas eu quero um ficheiro!"
                .ShowDialog()
            End If

            Dim SR As New IO.StreamReader(.FileName)
            SR.Close()
        End With

Também o podemos emparelhar:

Public Class Form1

    Private Structure Pessoa
        Public Nome As String
        Public Morada As Morada
    End Structure

    Private Structure Morada
        Public Pais As String
        Public Cidade As Cidade
    End Structure

    Private Structure Cidade
        Public Localidade As Localidade
        Public Distrito As String
    End Structure

    Private Structure Localidade
        Public Rua As String
        Public Porta As String
        Public CodigoPostal As String
    End Structure

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim Homem As New Pessoa
        Dim Nome As String = String.Empty
        Dim Rua As String = String.Empty

        With Homem
            Nome = .Nome

            With .Morada.Cidade.Localidade
                Rua = .Rua
            End With

        End With

    End Sub
End Class

Ideia: O exemplo anterior utiliza estructuras. Poderá saber mais sobre estructuras através do artigo Structures - Classes de brincar.

Em inicializações

Em inicializações o With é também bastante útil.

Sem With:

        Dim Botao As New Button
        Botao.Top = 0
        Botao.Left = 0
        Botao.Text = "I, Botão."

Com With:

Dim Botao As New Button With {.Top = 0, .Left = 0, .Text = "I, Botão."}

Esta última utilização do With é particularmente útil se estivermos a instanciar objectos fora de uma Sub, onde não podemos atribuír valores logo após inicialização. Com o With, já pode ser instanciado e inicializado.