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