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ários – Removido
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 TaskRegister (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 um comentário