VB .NET -  Usando os recursos básicos da linguagem (revisão)


 No artigo de hoje vamos recordar os recursos básicos da linguagem VB .NET que todo o desenvolvedor deve conhecer e usar no seu dia a dia.

A linguagem VB .NET apresenta muitos recursos e conhecer todos não é uma tarefa trivial. Mas conhecer e usar os recursos básicos da linguagem é uma obrigação de todo o bom desenvolvedor.

Neste artigo vamos recordar os seguintes recursos:

Recursos usados:

Nota: Baixe e use a versão Community 2015 do VS ela é grátis e é equivalente a versão Professional.

Criando o projeto no Visual Studio 2015 Community

Abra o VS 2015 Community e clique em New Project;

Selecione Other Project Types -> Visual Studio Solutions -> Blank Solution;

Informe o nome VBNET_RecursosBasicos e clique no botão OK;

A seguir para cada projeto iremos usar a opção File->Add -> New Project e incluir o projeto na solução.

1- Propriedades Auto-Implementadas

As propriedades AutoImplementadas permitem que você especifique rapidamente uma propriedade de uma classe sem precisar escrever código para obter e definir a propriedade.

Quando você escreve código definindo uma propriedade Autoimplementada, o compilador Visual Basic automaticamente cria um campo privado para armazenar a variável de propriedade, além de criar os procedimentos Get e Set associados.

Usando esse recurso, uma propriedade, incluindo um valor padrão, pode ser declarada em uma única linha de código e ainda ter o seu valor atribuído na declaração.

Exemplo:

Public Class Demo
    Public Property Nome As String
    Public Property Email As String = "macoratti@yahoo.com"
    Public Property Items As New List(Of String) From {"Caneta", "Caderno", "Borracha"}
    Public Property ID As New Guid()
    Public ReadOnly Property Arquivo As String

    Sub New(_arquivo As String)
        Me.Arquivo = _arquivo
    End Sub
End Class

A partir da versão do VB .NET 14 (Visual Studio 2015) podemos declarar propriedades Read-Only e pode atribuir o seu valor no construtor da classe.

Então, ganhe tempo usando este recurso e economize muitas linhas de código.

2- Variáveis tipadas implicitamente

As variáveis tipadas implicitamente são variáveis que podem ser declaradas sem a especificação de um tipo de dados .NET de forma explícita.

Em uma declaração de variável local tipada implicitamente, o tipo de variável local é obtido a partir da expressão usada para inicializar a variável.

O tipo da variável é inferido em tempo de compilação a partir da expressão do lado direito da instrução de inicialização.

No VB .NET usamos a palavra reservada Dim na declaração da variável e omitimos o tipo na declaração. Assim a variável será tipada implicitamente.

Exemplos:

Public Class Teste
    Dim clientes As New List(Of Cliente)
    ' i é compilado como um int
    Dim i = 5
    ' nome é compilado como uma string
    Dim nome = "Macoratti"
    ' numeros é compilado como um int[]
    Dim numeros = {0, 1, 2}
    ' consulta é compilada como  IEnumerable<Cliente>
    ' ou como IQueryable<Cliente>
    Dim consulta = From c In clientes Where c.Nome = "Macoratti"
    ' anonimo é compilado como um tipo anônimo
    Dim anonimo = New With
                            {
                               .Nome = "Macoratti",
                               .Idade = 44
                            }
    ' lista é compilada como um List<int>                             
    Dim lista = New List(Of Integer)
End Class

Public Class Cliente
    Public Property Nome As String
    Public Property Id As Integer
End Class
 

Para que esse recurso funcione de forma correta a opção : Option Infer deve estar declarada como On.

Você pode usar este recurso e deixar o trabalho de inferir os tipos para o compilador.

3- Inicializadores de objetos

Os Inicializadores de objeto permitem que você especifique propriedades para um objeto complexo usando uma única expressão.

Eles podem ser usados para criar instâncias de tipos nomeados e de tipos anônimos.

Declarações de instâncias de tipos anônimos e nomeados podem parecer quase idênticas, mas seus efeitos não são iguais. Cada categoria tem capacidades e restrições.

O exemplo a seguir mostra uma maneira conveniente para declarar e inicializar uma instância de uma classe nomeada, Cliente, usando uma lista de inicializador de objeto. Observe que o nome da classe está especificado após a palavra-chave New.

 
   Dim novoCliente = New Cliente With {.Nome = "Macoratti", .Email = "macoratti@yahoo.com"}
 

No código acima uma classe Cliente com as propriedades Nome e Email tem que existir.

Um tipo anônimo não tem nenhum nome. Portanto, uma instanciação de um tipo anônimo não pode incluir um nome de classe: 

 
 Dim clienteAnonimo = New With {.Nome = "Macoratti", .Idade = 45, .Email = "macoratti@yahoo.com"}
 

Neste código o compilador define uma nova classe com as propriedades : Nome, Idade e Email.

Os Inicializadores de objeto fornecem uma maneira simples de chamar o construtor de um tipo e, em seguida, definir os valores de algumas ou de todas as propriedades em uma única instrução.

O compilador invocará o construtor apropriado para a instrução:

Depois disso, as propriedades especificadas são inicializadas na ordem em que são apresentados na lista de inicializador.

4- Tipos Anônimos

Os tipos anônimos fornecem uma maneira conveniente para encapsular um conjunto de propriedades somente leitura em um único objeto sem precisar primeiro definir explicitamente um tipo.

O nome do tipo é gerado pelo compilador e não está disponível no nível do código fonte. O tipo das propriedades é inferido pelo compilador.


No exemplo abaixo temos um tipo
anônimo sendo inicializado com 3 propriedades chamadas id, preco e nome.
 

Module Module1	
    Sub Main()
        Dim produto = New With {.id = 1, .nome = "Monitor LED 32 polegadas", .preco = 1500}
        Console.WriteLine("id: {0} {1} - preço: {2:n2}", produto.id, produto.nome, produto.preco)
        Console.ReadKey()
    End Sub
End Module

O Visual Basic oferece suporte a tipos anônimos, que permitem criar objetos sem escrever uma definição de classe para o tipo de dados. Em vez disso, o compilador gera uma classe para você.

A classe não possui um nome utilizável, herda diretamente da classe  Object e contém as propriedades que você especificar ao declarar o objeto.

Como não foi especificado o nome do tipo de dados, ele é conhecido como um tipo anônimo.

Tipos anônimos são criados usando operador new com um inicializador de objeto.

A declaração de uma instância de um tipo anônimo usa uma lista de inicializador para especificar as propriedades do tipo.

Você pode especificar apenas propriedades quando você declara um tipo anônimo, mas não outros elementos de classe como métodos ou eventos.

5- Métodos de extensão

Os Extensions Methods ou métodos de extensão são uma implementação do padrão de projeto estrutural Composite e permitem que você adicione uma nova funcionalidade a um tipo de dado que já foi definido sem ter que criar um novo tipo derivado; dessa forma a funcionalidade comporta como um outro membro do tipo.

Através da aplicação dos Extensions Methods você pode, por exemplo, incluir funcionalidades adicionais a uma string sem ter que herdar da classe String, e o novo comportamento é tratado como um novo membro; assim, com os Extensions Methods é possível escrever um método que pode ser chamado como se ele fosse um método de instância de um tipo existente.

Um método de extensão pode ser apenas um procedimento Sub ou Function. Não é possível definir uma propriedade, um campo, ou um evento de extensão.

Todos os métodos de extensão devem ser marcados com o atributo de extensão <Extension()> do namespace System.Runtime.CompilerServices.

O primeiro parâmetro de uma definição de método de extensão especifica o tipo de dado a partir do qual o método estende.

Quando o método é executado, o primeiro parâmetro é associado à instância do tipo de dados que chama o método.

Exemplo :

Module Module1
    <Extension()>
    Public Sub ExibirMensagem(ByVal texto As String)
        Messagebox.Show(texto)
    End Sub
End Module

O código acima cria o método de extensão ExibirMensagem() para a classe String.(o primeiro parâmetro)

Os métodos de extensão podem ser declarados somente em Módulos (Module).
Usado com bom senso os Extensions Methods podem ser uma 'mão na roda' para o desenvolvedor Visual Basic.
6- Expressões lambdas

As expressões lambdas são funções ou sub-rotinas que podem conter expressões e declarações que são usadas para criar delegates e árvores de expressões onde o tipo das variáveis não precisam ser declarados visto que elas usam métodos anônimos.

Como uma expressão lambda é uma expressão, ela somente pode ser usada como parte de uma instrução.

Desta forma podemos declarar a expressão lambda e chamar a função passando um valor ao parâmetro. Você cria uma expressão lambda usando as palavras reservadas Sub ou Function.

  Sub Main()
        Dim incremento1 = Function(x) x + 1
        Dim incremento2 = Function(x)
                                         Return x + 2
                                     End Function
        Dim mensagem = Sub(texto) Console.WriteLine(texto)         
    End Sub
As expressões lambdas podem ser definidas em uma ou várias linhas.
O lado esquerdo do operador lambda especifica os parâmetros de entrada (se houver) 
e o lado direito trata a expressão ou bloco de instruções.

 

Você também pode declarar e chamar uma expressão lambda ao mesmo tempo, como mostrado no exemplo a seguir :

 
        Console.WriteLine((Function(numero As Integer) numero + 1)(5))        

 

No exemplo abaixo a expressão lambda cria o Delegate Func que vai receber um valor do tipo Integer e devolver como resultado um valor do tipo Integer.

     Sub Main()
        Dim expLambda1 As Func(Of Integer, Integer) = Function(x) x * x

        Console.WriteLine("Valor de 5 * 5 = " + expLambda1(5).ToString())
        Console.ReadKey()
    End Sub

Sintaxe as expressões lambdas:

  • Uma expressão lambda não tem um nome;
  • Expressões lambda não podem ter modificadores, como Overloads ou Overrides;
  • Funções lambda de linha única não usam a cláusula As para designar o tipo de retorno;
  • As sub-rotinas e funções de linha única não incluem uma instrução End Function ou End Sub;
  • Você pode especificar o tipo de dados de um parâmetro da expressão lambda usando a palavra-chave As ou o tipo de dados do parâmetro que pode ser deduzido. (Ou todos os parâmetros devem ter tipos de dados especificados ou todos devem ser inferidos.)
  • Os parâmetros Optional e Paramarray não são permitidos;
  • Parâmetros genéricos não são permitidos;
  • O corpo de uma função de linha deve ser uma expressão que retorna um valor, não uma instrução. Não existe instrução Return para funções de linha única. O valor retornado pela função de linha é o valor da expressão no corpo da função;
  • Expressões lambdas apresentam várias vantagens como transportar funções como valores, tornar o código mais simples, poder usar automaticamente todas as variáveis do escopo, etc.

    Os seis recursos apresentados neste artigo como essenciais, não contemplam todo o escopo do conhecimento que um bom desenvolvedor deve possuir, apenas foram destacados pela sua importância quando aplicados corretamente no dia a dia do programador. Eles são a base de conhecimento que todo o programador VB .NET deve saber na ponta da língua.

    Porque pela graça sois salvos, por meio da fé; e isto não vem de vós, é dom de Deus.
    Não vem das obras, para que ninguém se glorie;

    Efésios 2:8,9

    Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

    Quer migrar para o VB .NET ?

    Quer aprender C# ??

    Quer aprender os conceitos da Programação Orientada a objetos ?

    Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

    Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

     

      Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

     

    Referências:


    José Carlos Macoratti