Want create site? Find Free WordPress Themes and plugins.

csharp06a00

Em um artigo anterior iniciei uma série com o objetivo discutir as principais novidades do C# 6.0, além de funcionalidades do Visual Studio 2015 relacionadas diretamente à implementação de código. Dando continuidade a este trabalho, serão apresentados neste novo post os seguintes recursos:

  • Auto-Property Initializers;
  • Expression-bodied Members;
  • Debug de expressões lambdas.

OBSERVAÇÃO: todos os exemplos aqui descritos foram implementados através do Visual Studio Ultimate 2015 Preview.

Auto-Property Initializers

Antes da versão 6.0, a especificação de valores default para propriedades poderia ser feita de duas maneiras em C#:

  • No construtor de uma classe;
  • Na declaração dos atributos que possam servir de base para a implementação das propriedades.

No caso específico de uma propriedade somente leitura, a definição deste tipo de construção tornará obrigatório o uso de um atributo ou levará à indicação direta de um valor no getter deste elemento.

Na Listagem 1 está um exemplo que ilustra as diferentes situações aqui descritas:

  • O enum TipoLog define os diferentes tipos de log possíveis para uma aplicação (informação, alerta ou erro);
  • Já a classe MensagemLog representa um registro de log, contando com propriedades que identificam a data, tipo de aviso e um conteúdo que descreve o que aconteceu sob a forma de uma mensagem de texto. O valor da propriedade somente leitura Data está atrelado ao atributo “_data”, o qual está sendo inicializado em sua própria declaração. Quanto à propriedade Tipo, a inicialização deste elemento está sendo realizada no construtor da classe MensagemLog.
using System;

namespace TesteInicializacaoPropriedades
{
    public enum TipoLog
    {
        Informacao,
        Alerta,
        Erro
    }

    public class MensagemLog
    {
        private DateTime _data = DateTime.Now;

        public DateTime Data
        {
            get
            {
                return this._data;
            }
        }

        public TipoLog Tipo { get; set; }

        public string Mensagem { get; set; }

        public MensagemLog()
        {
            this.Tipo = TipoLog.Informacao;
        }
    }
}

Listagem 1: Exemplo de inicialização de propriedades em versões anteriores do C#

O C# 6.0 introduziu um novo recurso chamado “Auto-Property Initializers”, de maneira a simplificar a definição de valores iniciais para propriedades e contribuir para a obtenção de um código mais enxuto. Conforme é possível observar na Listagem 2, foram atribuídos valores aos elementos “Data” e “Tipo” de um modo similar àquele utilizado para o preenchimento de atributos.

using System;

namespace TesteInicializacaoPropriedades
{
    public enum TipoLog
    {
        Informacao,
        Alerta,
        Erro
    }

    public class MensagemLog
    {
        public DateTime Data { get; } = DateTime.Now;
        public TipoLog Tipo { get; set; } = TipoLog.Informacao;
        public string Mensagem { get; set; }
    }
}

Listagem 2: Exemplo anterior refatorado, já utilizando Auto-Property Initializers

Por fim, na Listagem 3 está um exemplo de uso da versão refatorada da classe MensagemLog. O método ExibirConteudoLog exibirá o conteúdo associado às diferentes propriedades desta classe: a primeira invocação a esta operação retornará os valores definidos a partir da utilização deste novo mecanismo de inicialização, ao passo que na segunda chamada já constarão as alterações efetuadas na instância do tipo MensagemLog. O resultado da execução deste programa de testes está na Imagem 1.

using System;

namespace TesteInicializacaoPropriedades
{
    class Program
    {
        public static string ExibirConteudoLog(MensagemLog log)
        {
            return String.Format(
                "*** Mensagem de Log ***\nData: {0}\nTipo: {1}\nMensagem: {2}",
                log.Data, log.Tipo, log.Mensagem);
        }

        static void Main(string[] args)
        {
            MensagemLog msgLog = new MensagemLog();

            Console.WriteLine("Valores do objeto MensagemLog logo após a inicialização...\n");
            Console.WriteLine(ExibirConteudoLog(msgLog));

            msgLog.Tipo = TipoLog.Alerta;
            msgLog.Mensagem = "Exemplo de mensagem de alerta.";

            Console.WriteLine("\n\nValores do objeto MensagemLog logo após alterações...\n");
            Console.WriteLine(ExibirConteudoLog(msgLog));

            Console.ReadKey();
        }
    }
}

Listagem 3: Exemplo de utilização da classe MensagemLog

csharp06b01
Imagem 1. Resultado dos testes demonstrando o uso do recurso Auto-Property Initializers

Expression-bodied Members

As expressões lambda surgiram ainda na versão 3.0 da linguagem C#, sendo parte integrante da extensão LINQ (Language-Integrated Query). Na prática, uma expressão lambda nada mais é do que uma função anônima: por representar uma espécie de método não-declarado e implementado justamente no ponto em que o mesmo se faz necessário, este tipo de construção acaba por dispensar a implementação no corpo de uma classe de operações simples e que conteriam normalmente uma única instrução.

Embora concebidas para simplificar e tornar mais enxuto o processo de codificação de uma aplicação, o uso de expressões lambdas antes do C# 6.0 estava restrito ao corpo de métodos que pudessem vir a compor uma classe. Graças a um novo recurso conhecido como “Expression-bodied Members”, agora também é possível a implementação de propriedades somente leitura e métodos a partir de expressões lambda.

Na Listagem 4 está um exemplo de propriedade somente leitura declarada de uma forma convencional. A classe ItemPedido representa um produto vinculado a um pedido de venda, sendo que a propriedade somente leitura TotalItem será calculada a partir dos valores associados aos elementos Quantidade e Preco.

namespace TesteExpressionBodiedProperty
{
    public class ItemPedido
    {
        public string CodigoBarras { get; set; }

        public int Quantidade { get; set; }

        public double Preco { get; set; }

        public double TotalItem
        {
            get
            {
                return Quantidade * Preco;
            }
        }
    }
}

Listagem 4: Exemplo de declaração de uma propriedade somente leitura em versões anteriores do C#

Já a Listagem 5 apresenta uma versão atualizada do tipo ItemPedido, na qual TotalItem foi declarada como uma Expression-bodied Property. Como é possível observar, a declaração da propriedade TotalItem foi feita em uma única linha: este novo recurso dispensa o uso das palavras chaves “get” e “return”, além dos caracteres (chaves) que marcam o início e o fim de um bloco de instruções.

namespace TesteExpressionBodiedProperty
{
    public class ItemPedido
    {
        public string CodigoBarras { get; set; }

        public int Quantidade { get; set; }

        public double Preco { get; set; }

        public double TotalItem => Quantidade * Preco;
    }
}

Listagem 5: Exemplo anterior modificado, já utilizando uma Expression-bodied Property

Concluindo esta primeira demonstração do uso de Expression-bodied Members, na Listagem 6 está um bloco de código que emprega a versão modificada da classe ItemPedido. Caberá ao método ExibirInformacoesItemPedido acessar as diferentes propriedades definidas em ItemPedido: duas chamadas serão realizadas a esta operação, a fim de demonstrar o funcionamento da expressão lambda que implementa o cálculo da propriedade TotalItem. Na Imagem 2 está o resultado da execução deste programa de testes.

using System;

namespace TesteExpressionBodiedProperty
{
    class Program
    {
        public static string ExibirInformacoesItemPedido(ItemPedido item)
        {
            return String.Format(
                "*** Item de Venda ***\nCódigo de Barras: {0}\n" +
                "Quantidade: {1}\nPreco: {2}\nValor Total: {3}",
                item.CodigoBarras, item.Quantidade, item.Preco, item.TotalItem);
        }

        static void Main(string[] args)
        {
            ItemPedido item = new ItemPedido();
            item.CodigoBarras = "7890000000001";
            item.Quantidade = 3;
            item.Preco = 15.75;

            Console.WriteLine("Valores iniciais para o objeto ItemVenda...\n");
            Console.WriteLine(ExibirInformacoesItemPedido(item));

            item.Quantidade = 5;
            item.Preco = 18.77;

            Console.WriteLine("\n\nValores do objeto ItemVenda logo após as alterações...\n");
            Console.WriteLine(ExibirInformacoesItemPedido(item));

            Console.ReadKey();
        }
    }
}

Listagem 6: Exemplo de utilização da classe ItemPedido

csharp06b02
Imagem 2. Resultado dos testes demonstrando o uso do recurso Expression-bodied Property

Com o objetivo de detalhar como acontece a implementação de Expression-bodied Functions, a Listagem 7 apresenta um segundo exemplo envolvendo uma classe chamada Cidade. O método ToString foi sobrecarregado, de maneira a retornar como resultado uma string em que constem o nome e o estado de uma cidade.

namespace TesteExpressionBodiedFunction
{
    public class Cidade
    {
        public string Nome { get; set; }

        public string Estado { get; set; }

        public override string ToString()
        {
            return this.Nome + " - " + this.Estado;
        }
    }
}

Listagem 7: Exemplo de implementação de um método na maneira convencional

Já na Listagem 8 está a implementação atualizada do tipo Cidade, sendo que o método ToString foi modificado para que se demonstrasse a utilização de uma Expression-bodied Function.

namespace TesteExpressionBodiedFunction
{
    public class Cidade
    {
        public string Nome { get; set; }

        public string Estado { get; set; }

        public override string ToString() => this.Nome + " - " + this.Estado;
    }
}

Listagem 8: Exemplo anterior modificado, já utilizando uma Expression-bodied Function

Finalmente, na Listagem 9 está um exemplo de utilização da nova versão da classe Cidade. A passagem da variável “cidade” como parâmetro ao método WriteLine do tipo Console fará com que a operação ToString seja invocada. O resultado da execução deste bloco de código está na Imagem 3.

using System;

namespace TesteExpressionBodiedFunction
{
    class Program
    {
        static void Main(string[] args)
        {
            Cidade cidade = new Cidade();
            cidade.Nome = "São Paulo";
            cidade.Estado = "SP";

            Console.WriteLine("Resultado da invocação do método " +
                "ToString() em um objeto do tipo Cidade:");
            Console.WriteLine(cidade);

            Console.ReadKey();
        }
    }
}

Listagem 9: Exemplo de utilização da classe Cidade

csharp06b03
Imagem 3. Resultado dos testes demonstrando o uso do recurso Expression-bodied Function

Debug de expressões lambdas

A possibilidade de depurar expressões lambdas a partir de locais como a janela Watch do Visual Studio era um pedido antigo de muitos desenvolvedores. A grande novidade é que o debugger da versão 2015 também suporta agora este tipo de funcionalidade, superando assim uma limitação que vinha desde o Visual Studio 2008.

Na Imagem 4 é demonstrada uma tentativa de uso de uma expressão lambda, a partir da janela Watch no Visual Studio 2013. Como já era de se esperar, o depurador retornou uma mensagem informando de que este tipo de recurso não é suportado.

csharp06b04
Imagem 4. Tentativa de uso de uma expressão lambda durante a depuração no Visual Studio 2013

Ao se repetir dentro do Visual Studio 2015 o processo detalhado no passo anterior, será possível observar desta vez que a utilização da mesma expressão lambda teve sucesso (Imagem 5).

csharp06b05
Imagem 5. Executando uma expressão lambda durante a depuração no Visual Studio 2015

Conclusão

Neste segundo post dei continuidade à demonstração de novos recursos introduzidos no C# 6.0 e no Visual Studio 2015. Embora as mudanças apresentadas não signifiquem uma mudança drástica no processo de codificação, tais novidades têm por finalidade tornar mais enxuta e simplificada a implementação de aplicações em .NET.

Aproveito ainda para agradecer o feedback positivo que recebi no primeiro artigo desta série. Minha estimativa é de produzir ainda mais 2 posts, os quais serão publicados em breve.

Até uma próxima oportunidade!

Links

A C# 6.0 Language Preview
http://msdn.microsoft.com/en-us/magazine/dn683793.aspx

Better together: C# 6 and the Visual Studio 2015 Debugger
http://blogs.msdn.com/b/csharpfaq/archive/2014/12/11/better-together-c-6-and-the-visual-studio-2015-debugger.aspx

New Features in C# 6
http://blogs.msdn.com/b/csharpfaq/archive/2014/11/20/new-features-in-c-6.aspx

The New and Improved C# 6.0
http://msdn.microsoft.com/en-us/magazine/dn802602.aspx

What’s New In C# 6.0
http://channel9.msdn.com/Events/Visual-Studio/Connect-event-2014/116

Renato Groffe

Atua como consultor em atividades voltadas ao desenvolvimento de softwares há mais de 13 anos. Bacharel em Sistemas de Informação, com especialização em Engenharia de Software. Microsoft Certified Technology Specialist (Web, WCF, Distributed Applications, ADO.NET, Windows Forms), Microsoft Specialist (HTML5 with JavaScript and CSS3, Developing ASP.NET MVC 4 Web Applications), Oracle Certified Associate (PL/SQL), Sun Certified (SCJP, SCWCD), ITIL Foundation V2, Cobit 4.1 Foundation.

Facebook Google+ 

Did you find apk for android? You can find new Free Android Games and apps.

Comentários

comentarios