Back-End

17 out, 2017

C# 7.0: novos Expression-bodied Members

Publicidade

Uma das novidades trazidas pelo C# 6.0 foi a possibilidade de implementar propriedades somente leitura e métodos por meio de expressões lambda. Este recurso ficou conhecido como Expression-bodied Members, tendo sido abordado anteriormente em outro artigo do TechNet Wiki.

O C# 7.0 expandiu as possibilidades de uso dos Expression-bodied Members, permitindo o uso de expressões lambda em construtores, finalizers e propriedades que aceitem a atribuição de valores (neste caso com as seções get e set presentes).

No exemplo a seguir é possível observar a implementação da classe CargaDados, com um construtor e um finalizer:

using System.IO;
 
namespace ExpressionBodiedMembers01
{
    class CargaDados
    {
        private string _tempDir;
 
        public CargaDados(string diretorioTemporario)
        {
            _tempDir = diretorioTemporario;
        }
 
        ~CargaDados()
        {
            Directory.Delete(_tempDir);
        }
 
        ...
    }
}

Já a próxima listagem traz o tipo CargaDados refatorado, com o construtor e o finalizer já utilizando uma expressão lambda em suas definições:

using System.IO;
 
namespace ExpressionBodiedMembers01
{
    class CargaDados
    {
        private string _tempDir;
 
        public CargaDados(string diretorioTemporario) =>
            _tempDir = diretorioTemporario;
 
        ~CargaDados() => Directory.Delete(_tempDir);
 
        ...
    }
}

A seguir está a implementação e um exemplo de uso da classe Cotacao:

using System;
 
namespace ExpressionBodiedMembers02
{
    public class Cotacao
    {
        public string Sigla { get; set; }
        public string NomeMoeda { get; set; }
        public DateTime UltimaAtualizacao { get; set; }
 
        private double _valor;
 
        public double Valor
        {
            get { return _valor; }
            set
            {
                _valor = value >= 0 ? value : 0;
            }
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            Cotacao cotacao = new Cotacao();
            cotacao.Sigla = "USD";
            cotacao.NomeMoeda = "Dolar norte-americano";
            cotacao.UltimaAtualizacao =
                new DateTime(2017, 03, 10, 17, 59, 00);
            cotacao.Valor = 3.1435;
 
            Console.WriteLine(
                quot;Moeda: {cotacao.NomeMoeda} ({cotacao.Sigla}) - " +
                quot;Ultima Atualizacao: {cotacao.UltimaAtualizacao.ToString()} - " +
                quot;Valor: {cotacao.Valor}");
 
            Console.ReadKey();
        }
    }
}

Também é possível alterar o tipo Cotacao, de forma que a propriedade Valor faça uso de uma expressão lambda em sua definição:

using System;
 
namespace ExpressionBodiedMembers02
{
    public class Cotacao
    {
        public string Sigla { get; set; }
        public string NomeMoeda { get; set; }
        public DateTime UltimaAtualizacao { get; set; }
 
        private double _valor;
 
        // Expressões lambda na definição da propriedade Valor
        public double Valor
        {
            get => _valor;
            set => _valor = value >= 0 ? value : 0;
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            Cotacao cotacao = new Cotacao();
            cotacao.Sigla = "USD";
            cotacao.NomeMoeda = "Dolar norte-americano";
            cotacao.UltimaAtualizacao =
                new DateTime(2017, 03, 10, 17, 59, 00);
            cotacao.Valor = 3.1435;
 
            Console.WriteLine(
                quot;Moeda: {cotacao.NomeMoeda} ({cotacao.Sigla}) - " +
                quot;Ultima Atualizacao: {cotacao.UltimaAtualizacao.ToString()} - " +
                quot;Valor: {cotacao.Valor}");
 
            Console.ReadKey();
        }
    }
}

Ao se executar este último exemplo teremos como resultado:

Referências