Após vermos algumas das novidades do framework 4.6 do .net no post C# 6.0 – novidades da linguagem – parte 1, vamos seguir falando das novidades da linguagem.
Expression-bodied methods para a definição de métodos simples
Essa é outra novidade que gostei bastante, e proporciona um código mais enxuto e legível. É comum termos em nossas aplicações, métodos que retornem apenas uma linha, certo? Essa novidade vem facilitar e simplificar a escrita desses métodos, que agora podem ser definidos da seguinte forma:
public int Somar(int a, int b) => a + b;
public string Nome { get; set; } public string Sobrenome { get; set; } public string NomeCompleto => Nome + " " + Sobrenome;
No primeiro exemplo, estamos implementando o método Somar, e retornando o valor de a + b. No segundo exemplo, estamos implementando o GET de uma propriedade, e retornando a concatenação de Nome e Sobrenome. Nesse caso, quando utilizado em propriedades, não precisamos declarar o GET, e não podemos ter um método SET.
Ficamos com um código bem mais enxuto e legível, não?
Operador condicional nulo
Essa é outra grande novidade do C# 6.0, que ajuda a deixar o código mais limpo, imaginem a seguinte classe:
public class DesenvolvedorSamurai { private ILinguagemProgramacao _linguagemProgramacao; public DesenvolvedorSamurai(ILinguagemProgramacao linguagemProgramacao) { this._linguagemProgramacao = linguagemProgramacao; } public string GetLinguagemProgramacao() { if (_linguagemProgramacao != null) return _linguagemProgramacao.Nome; else return null; } }
Na classe acima, no método GetLinguagemProgramacao, eu preciso testar se a variável _linguagemProgramacao é diferente de nula, para garantir que não seja gerada uma exceção caso esteja vazia. Agora veja como fica a mesma classe, com o operador condicional nulo:
public class DesenvolvedorSamurai : IDesenvolvedor { private ILinguagemProgramacao _linguagemProgramacao; public DesenvolvedorSamurai(ILinguagemProgramacao linguagemProgramacao) { this._linguagemProgramacao = linguagemProgramacao; } public string GetLinguagemProgramacao() => _linguagemProgramacao?.Nome; }
Repare na expressão _linguagemProgramacao?.Nome, veja que agora existe um ponto de interrogação aí no meio, pois é ele quem faz a mágica. Usando o ?, estamos dizendo ao .net que a propriedade Nome, só deve ser acessada se a variável _linguagemProgramacao não seja nula, ou seja, o que está a direita da ? só é acessado se o que estiver a esquerda possuir valor. No nosso caso, trocamos 7 linhas de código por apenas 1.
Operador nameof
Essa é uma mudança que parece boba, mas que é comum acontecer no dia a dia. Imaginem o código abaixo:
public void SetLinguagemProgramacao(ILinguagemProgramacao linguagemProgramacao) { if (linguagemProgramacao == null) throw new ArgumentNullException("linguagemProgramacao"); }
Nada de errado certo? O problema é que se renomearmos a variável linguagemProgramacao através do recurso de refactor do Visual Studio (utilizando a tecla F2), o Visual Studio irá renomear apenas a variável, e não a string definida como parâmetro da exceção. Agora esse problema não mais acontecerá, pois podemos substituir a string pelo comando nameof. O código fica dessa forma:
public void SetLinguagemProgramacao(ILinguagemProgramacao linguagemProgramacao) { if (linguagemProgramacao == null) throw new ArgumentNullException(nameof(linguagemProgramacao)); }
Filtros em Exceções
Essa é outra novidade interessante, com ela podemos fazer filtros dentro de uma exceção, dessa forma, a exceção só é interceptada (ou capturada) se a condição for verdadeira, caso contrário, a exceção não é capturada e segue adiante. Veja o trecho de código abaixo:
public void ParseData() { try { DateTime data = DateTime.Parse("1988-10-10"); } catch (FormatException e) when (e.Message.StartsWith("DateTime")) { throw new Exception("Formatação de Data Inválido."); } catch (FormatException e) when (!e.Message.StartsWith("DateTime")) { throw new Exception("Outra Exceção detectada."); } }
public Teste() { try { DateTime data = DateTime.Parse("1988-10-10"); } catch (FormatException e) when (e.Message.StartsWith("DateTime")) { throw new Exception("Formatação de Data Inválido."); } //se não for a exceção que procuro, deixo que seja propagada para quem chamou o método Teste() }
No primeiro exemplo, estamos tratando a exceção quando ela começa com “DateTime” e quando não começa, já no segundo exemplo, só tratamos quando ela começa com “DateTime”, caso contrário, deixamos que seja propagada para quem chamou o método Teste(). Esse recurso é interessante, pode ser bastante útil em determinadas situações, mas é algo que no dia a dia não deve ser tão usado, quanto outras novidades que foram incorporadas na linguagem.
Com essa segunda parte, encerramos os posts com as novidades de linguagem do C# 6.0.

Quase 20 anos de experiência no mercado de TI.
Atuação em grandes empresas como Netshoes, Borland, JBS, Bradesco, Hospital das Clínicas, Rede, Prodam, HSPE, Instituto Ayrton Senna, e também em empresas internacionais como Delta Dental, T-Mobile, Pepsi e Mckesson.
Fundador da TecPrime Solutions, administrador da comunidade nopCommerce Brasil, e autor dos sites InvestFacil.net e Desenvolvedores.ninja
1 thought on “C# 6.0 – novidades da linguagem – parte 2”