.NET

20 mai, 2015

Visual Basic 14 – Novidades da nova versão: o operador ?.

Publicidade

O Visual Basic 14 é a mais nova versão do Visual Basic ou VB .NET, e será lançado como parte do Visual Studio 2015. Essa versão foi reescrita do zero em cerca de 1,3 milhão de linhas de código e, segundo a Microsoft, a equipe aproveitou para reescrever a repensar todas as partes do Visual Basic.

No primeiro, artigo eu abordei o tópico: Visual Basic 14 – Novidades da nova versão – I: Refatoração embutida.

Hoje veremos o operador  ?.

Esse novo operador é um atalho conveniente para as muitas ocasiões em que você tem que verificar valores nulos.

A ideia é economizar digitação quando for necessário realizar verificações de valores nulos.

Assim, em vez de digitar isto:

Dim temp = cliente.Endereco
Dim x = if(temp IsNot Nothing, temp.Endereco.Pais, Nothing )

você digita isto:

Dim x = cliente.Endereco?.pais

Antes você fazia assim:

if cliente IsNot Nothing AndAlso cliente.Idade >=80 then
    Console.WriteLine("Enviar Mensagem")
End If

Agora você pode fazer assim:

if cliente?.Idade >= 80 then
    Console.WriteLine("Enviar Mensagem")
End If

Recursos usados: Visual Studio CTP 6 (poderá sofrer alterações até o release final).

Melhorando a experiência de codificação: menos código

Esse recurso permite economizar linhas de código dependendo do cenário em que você está atuando.

Para testar, vamos abrir o VS Studio CTP 6 e clicar em New Project.

Em seguida, selecione Visual Basic e o template Console Application, informe o nome VB14_OperadorInterrogacaoPonto e clique no botão OK.

No menu Project, clique em Add Class e informe o nome Cliente.

A seguir, digite o código abaixo para a classe Cliente:

Public Class Cliente

    Public Shared Property Id As Integer
    Public Shared Property Nome As String
    Public Property Idade As Integer

    Sub New()
        Id = 1
        Nome = "Macoratti"
        Idade = Nothing
    End Sub

End Class

Nesse código, definimos três propriedades na classe Cliente e atribuímos o valores no construtor. Definimos a propriedade Idade com o valor Nothing, ou seja, Null.

Agora, no módulo Module1, vamos testar o operador ?. digitando o código a seguir:

Module Module1
    Sub Main()

        Dim _cliente As New Cliente

        If _cliente?.Idade > 40 Then
            Console.WriteLine("A idade do cliente Não e nula e o cliente possui mais de 40 anos")
        Else
            Console.WriteLine("A idade do cliente é nula")
        End If

        Console.ReadKey()
    End Sub

End Module

Após criarmos uma instância da classe Cliente, verificamos se a idade do cliente não é nula usando o operador ?.,  e a seguir verificamos se a idade é maior que 40 anos:

If _cliente?.Idade > 40 Then …

Executando o projeto, iremos obter a mensagem:  “A idade do cliente é nula”.

Altere o código da classe Cliente para:

Public Class Cliente

    Public Shared Property Id As Integer
    Public Shared Property Nome As String
    Public Property Idade As Integer

    Sub New()
        Id = 1
        Idade = 45
    End Sub

End Class

A seguir, inclua o código abaixo no módulo Module1:

Module Module1
    Sub Main()

        Dim _cliente As New Cliente

        If _cliente?.Idade > 40 Then
            Console.WriteLine("A idade do cliente Não e nula e o cliente possui mais de 40 anos")
        Else
            Console.WriteLine("A idade do cliente é nula")
        End If

        Dim nome = If(_cliente?.Nome, "Nome em branco")
        Console.WriteLine("nome do cliente = " & nome)

        Console.ReadKey()
    End Sub

End Module

Note que agora estamos verificando se o nome do cliente é nulo. Se o nome for nulo, o valor “Nome em branco” será atribuído como padrão à variável nome.

Como não atribuímos um valor para o nome no construtor da classe, executando o projeto iremos obter:

vbn_nov1421

Na verdade, o operador ?. é mais seguro do que todos os exemplos acima sugerem. A expressão “_cliente?.Idade” na verdade lê “_cliente” em uma variável temporária, verifica se não é nula e, em seguida, obtém a propriedade Idade dessa variável temporária. Essa operação é thread-safe.

Podemos também usar o operador em uma sequência misturando-o com o operador regular .:

Por exemplo: a?.b.c?.

Esse trecho de código lê da esquerda para direita, e qualquer valor nulo em “?” irá parar a sequência; qualquer valor nulo em “.” irá lançar um NullReferenceException como de costume.

Verifique o recurso em seu próprio código e imagine as possibilidades. Codificar vai ficar mais fácil e intuitivo.