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/





