C# 6.0 – novidades da linguagem – parte 2

Facebooktwittergoogle_plusredditpinterestlinkedinmail

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

Facebooktwittergoogle_plusredditpinterestlinkedinmail
Com as palavras-chave

1 thought on “C# 6.0 – novidades da linguagem – parte 2

Deixe uma resposta

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