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
- New Features in C# 7.0: https://blogs.msdn.microsoft.com/dotnet/2017/03/09/new-features-in-c-7-0/