As novidades do C# 6

Seguindo a trilha de posts relacionados ao The Developers Conference – TDC que participarei com o ingresso que ganhei da SoftDesign (empresa que trabalho).

Contrutores primáriosRemovido

Quem é que lembra lá da longinqua versão 2 do C# que para criar uma classe era necessário declarar primeiramente os atributos, criar as propriedades e depois criar o construtor deixando o código gigantesco.

public class Cliente
{
	private string nome;
	private string sobrenome;

	public Cliente(string nome, string sobrenome)
	{
		this.nome = nome;
		this.sobrenome = sobrenome;
	}
	public string Nome
	{
		get { return nome; }
		set { nome = value; }
	}
	public string Sobrenome
	{
		get { return sobrenome; }
		set { sobrenome = value; }
	}
}

Na versão 3 do C# foi adicionado a possibilidade de deixar o código mais exuto para executar a mesma tarefa

public class Cliente
{
	public string Nome { get; set; }
	public string Sobrenome { get; set; }
}

Hoje é possível construir uma classe através dos Constutores primários que servem para representar em uma sintaxe mais concisa.

public class Cliente(string nome, string sobrenome)
{
	public string Nome { get; set; } = nome;
	public string Sobrenome { get; set; } = sobrenome;
}

Porém há a possibilidade de criar a classe já atribuindo valores constantes a ela

public class Cliente
{
	public string Nome { get; set; } = "Fabian";
	public string Sobrenome { get; set; } = "Corrêa Marques";
}

Await dentro das expressões Catch e Finally

Confesso que não cheguei a precisar utilizar esse recurso, mas achei muito interessante a possibilidade de poder utilizá-lo.

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task Register (RegisterViewModel model)
{
  if (ModelState.IsValid)
  {
	var user = new ApplicationUser { userName = model.UserName };
	try
	{
	    var result = await UserManager.CreateAsync(user, model.Password);
	    if (result.Succeeded)
		await SignInManager.SignInAsync(user, isPersistent: false);
	    else AddErrors(result);
	}
	catch (Exception) { await UserManager.DeleteAsync(user); }
	finally { await SignInManager.ValidateSecurityStampAsync(null, null); }
	return RedirectToAction("Index", "Home");
  }
  // If we got this far, something failed, redisplay form
  return View(model);

Expressão de corpo em membros de função

Esse recurso possibilita realizar uma expressão dentro da declaração dos membros/propriedades de uma classe, pegaremos a classe Cliente para exemplificar

public class Cliente(string nome, string sobrenome)
{
	public string Nome { get; set; } = nome;
	public string Sobrenome { get; set; } = sobrenome;
	public string NomeCompleto => String.Format("{0} {1}", Nome, Sobrenome); //retorna o nome completo do cliente
}

Propagação do operador NULL

Como é que nunca pensaram em fazer isso antes????????
Sim, para mim é uma das melhores novidades do C# 6 a possibilidade de verificar se o objeto está nulo antes de executar os métodos disponíveis e pegar os objetos filhos

var cep = clientes?.FirstorDefault()?.Compras?.FirstOrDefault()?.Cidade?.FirstOrDefault()?.Endereco?.CEP;

Expressão nameof

Sempre que vamos validar a presença de um parâmetro verificamos se ele está nulo e após isso atiramos a exceção ArgumentException informando o nome do campo em string.

void BuscaCliente(string nome)
{
	if (String.IsNullOrEmpty(nome))
	    throw new ArgumentException("nome");
}

Porém desta forma quando alteramos o nome do campo que recebemos por parâmetro o sistema não sabe que esse nome foi modificado, deixando o sistema inconsistente. Porém para resolver isso foi criado a expressão nameof.

void BuscaCliente(string nome)
{
	if (String.IsNullOrEmpty(nome))
	    throw new ArgumentException(nameof(nome));
}

Filtro dentro das exceções

Hoje é possível criar uma exceção e poder utilziar um filtro dentro dela

try
{
   DateTime data = DateTime.Parse("1986-04-17");
} catch (FormatException e) if (e.Message.StartsWith("The DateTime"))
{
    throw new Exception("Erro de formatação da data.");
} 

Interpolação de strings

Quando precisamos criar uma string usando objetos utilizamos o string.Format

string HoraUltimoAcesso(Cliente cliente)
{
    return string.Format("{0:hh:mm}", cliente.UltimoAcesso);
}

Com a nova opção de açúcar sintático fica mais fácil ainda

string HoraUltimoAcesso(Cliente cliente)
{
    return "\{cliente.UltimoAcesso:hh:mm}";
}

Uso de membros estáticos

E por fim com o intuíto de deixar o código mais legível e enxuto adicionado a possibilidade de usar somente um método/membro de uma classe estática já referenciada no using (recurso roubado do VB).

using System.Console;
using System.Math;
class Program
{
	static void Main()
	{
		WriteLine(Sqrt(3*3 + 4*4));
	}
}

Ou seja, hoje em dia não preciso mais usar o snippet cw para gerar o Console.Write

Para saber todos os recursos que estarão disponíveis visite a página do projeto Language Feature Status

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *