C# 7.0: novos Expression-bodied Members

NetCoders
netcoders
Published in
3 min readMar 15, 2017
expression-00

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

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:

[code language=”csharp”]
using System.IO;

namespace ExpressionBodiedMembers01
{
class CargaDados
{
private string _tempDir;

public CargaDados(string diretorioTemporario)
{
_tempDir = diretorioTemporario;
}

~CargaDados()
{
Directory.Delete(_tempDir);
}


}
}
[/code]

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:

[code language=”csharp”]
using System.IO;

namespace ExpressionBodiedMembers01
{
class CargaDados
{
private string _tempDir;

public CargaDados(string diretorioTemporario) =>
_tempDir = diretorioTemporario;

~CargaDados() => Directory.Delete(_tempDir);


}
}
[/code]

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

[code language=”csharp”]
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(
$”Moeda: {cotacao.NomeMoeda} ({cotacao.Sigla}) — “ +
$”Ultima Atualizacao: {cotacao.UltimaAtualizacao.ToString()} — “ +
$”Valor: {cotacao.Valor}”);

Console.ReadKey();
}
}
}
[/code]

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

[code language=”csharp”]
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(
$”Moeda: {cotacao.NomeMoeda} ({cotacao.Sigla}) — “ +
$”Ultima Atualizacao: {cotacao.UltimaAtualizacao.ToString()} — “ +
$”Valor: {cotacao.Valor}”);

Console.ReadKey();
}
}
}
[/code]

Ao se executar este último exemplo teremos como resultado:

expression-01

**********

E por falar em .NET, deixo aqui um convite. No dia 07/04 (sexta) teremos um bate-papo online (hangout) no Canal .NET sobre as novidades do C# 7.0, às 21h00 — horário de Brasília. Será uma ótima oportunidade para todos aqueles interessados em conhecer mais sobre o que mudou na versão mais recente desta linguagem.

Para efetuar sua inscrição acesse este link, a transmissão será via YouTube em um link a ser divulgado futuramente.

**********

Referências

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

--

--