C# - 5 Recursos que você tem que conhecer
Neste artigo vou mostrar cinco recursos importantes da linguagem C# que todo o desenvolvedor tem a obrigação de conhecer e usar no seu dia a dia. |
Não é segredo que a linguagem C# vem a cada dia ganhando adeptos de diversas áreas aumentando assim a comunidade interessada em usar os recursos da linguagem.
Desde o seu lançamento a linguagem C# vem evoluindo e incorporando importantes recursos com o objetivo de tornar a linguagem nais flexível, robusta e de facilitar a vida do programador C#.
Com tantos opções de recursos disponíveis muitas vezes 'esquecemos' ou deixamos de usar um recurso importante.
A seguir vou apresentar 5 recursos importantes que podem lhe ajudar muito.
1 - Filtrando Exceções |
A partir
da versão 6.0 a linguagem C inclui suporte a filtros de exceção que permite
capturar um tipo específico de exceção se uma expressão associada for
verdadeira. Você pode filtrar exceções, incluindo uma instrução when após
a expressão catch.
A palavra-chave when funciona como um if. Uma condição when
é uma expressão de predicado, que pode ser anexada a um bloco catch. Se a
expressão do predicado for avaliada como verdadeira, o bloco de captura
associado é executado; Caso contrário, o bloco catch é ignorado.
No exemplo abaixo, definimos um filtro que não captura a exceção da divisão por
zero aos domingos:
using System;
using System.Globalization;
namespace CShp_5Recursos
{
class Program
{
static void Main(string[] args)
{
DateTime dia = DateTime.Now;
CultureInfo idioma = new CultureInfo("pt-BR");
int denominador;
try
{
denominador = 0;
int x = 5 / denominador;
}
// Captura a exceção todos os dias exceto no domingo
catch (DivideByZeroException ex) when (dia.DayOfWeek != DayOfWeek.Sunday)
{
//exibe a data em português
Console.WriteLine("Hoje é " + dia.ToString("D", idioma));
Console.WriteLine(ex.Message);
}
Console.ReadKey();
}
}
}
|
O código acima só não captura a exceção no domingo. De quebra eu mostro como exibir a data em português usando o CultureInfo.
2 - Usando lambdas para propriedades automáticas Getter-Only |
A partir da versão 6.0 da linguagem C# você pode adicionar uma inicialização em uma propriedade automática como também em um campo.
Além disso você pode também usar uma expressão lambda para implementar o getter de uma propriedade automática somente leitura:
using System;
using System.Linq;
namespace Recurso2
{
class Pessoa
{
public string Nome { get; protected set; } = "José Carlos";
public string SobreNome { get; set; } = "Macoratti";
public int Idade { get; set; }
public string NomeCompleto => this.Nome + " " + SobreNome;
public string NomeInvertido => new string(this.Nome.Reverse().ToArray());
}
class Program
{
static void Main(string[] args)
{
Pessoa pessoa = new Pessoa();
Console.WriteLine(pessoa.NomeCompleto);
Console.WriteLine(pessoa.NomeInvertido);
Console.ReadKey();
}
}
}
|
A presença da expressão lambda diz ao compilador que esta é uma propriedade com um getter, e não um campo.
3 - Usando expressões lambdas para membros de funções |
Na versão
5.0 da linuagem C#, você podia usar uma expressão lambda sempre que uma
instância de delegado fosse esperada. Por exemplo:
Func<int,int>
doubleMeuNumero = (i) => 2 * i;
Na versão 6.0 do C#, você também pode usar uma expressão lambda como o
corpo de um membro da função. Isso simplifica a sintaxe para métodos simples.
using static System.Console;
namespace Recurso3
{
public class Gato
{
public Gato(string nome, int idade)
{
Nome = nome;
Idade = idade;
}
public string Nome { get; protected set; }
public int Idade { get; set; }
public void IncrementaIdade() => Idade++;
public int IdadeDoGatoEmAnos() => Idade * 7;
}
class Program
{
static void Main(string[] args)
{
Gato gato = new Gato("xaninho",3);
gato.IncrementaIdade();
WriteLine("Idade do " + gato.Nome + " em anos : " + gato.IdadeDoGatoEmAnos().ToString());
ReadKey();
}
}
}
|
No exemplo definimos duas funções usando expressão lambda.
De quebra eu estou mostrando como usar o recurso using static onde os métodos estáticos da classe Console agora são exibidos de forma mais limpa.
4 -Operador Null condicional (?) |
Para mostrar essa funcionalidade vamos supor que temos um controlador chamado ProdutoController em uma aplicação ASP .NET com o seguinte código:
using Mvc_CSharp.Models;
using System.Collections.Generic;
using System.Web.Mvc;
namespace Mvc_CSharp.Controllers { public class ProdutoController : Controller { public ActionResult Index() { List<string> resultado = new List<string>(); foreach (Produto p in Produto.GetProdutos()) { string nome = p?.Nome; decimal? preco = p?.Preco; resultado.Add(string.Format($"Nome: {nome}, Preço: {preco}");
}
return View(resultado);
}
}
}
|
A forma tradicional de tratar com nulls requer uma verificação explícita, o que pode levar a um código verboso e sujeito a erros quando temos que inspecionar um objeto e suas propriedades.
O operador condicional nulo permite que os valores null sejam detectados de forma mais elegante e simples.
O método estático GetProdutos retorna um array de objetos que estamos inspecionando no método Index do controlador para obter uma lista de nomes e preços.
O problema é que tanto o objeto no array como o valor das propriedades podem ser nulos o que significa que não podemos apenas referenciar p.Nome ou p.Preco dentro do laço foreach sem correr o risco de obter uma exceção do tipo NullReferenceException.
Para evitar isso estou usando o operador condicional nulo que é um recurso novo da linguagem C# :
string nome = p?.Nome;
decimal? preco = p?.Preco;
O operador null condicional é identificado por um sinal de interrogação ( ? ).
- Se p é null, então o nome
também será definido como null.
- Se p não for null então o nome será definido para o valor da propriedade
Produto.Nome.
O mesmo vale para a propriedade Preco.
De quebra eu estou usando o novo recurso da interpolação de strings : ($"Nome: {nome}, Preço: {preco}")
5 - Usando a nova sintaxe para inicializar Dicionários |
A partir da versão 6.0 do C# temos uma nova forma para inicializar dicionários que facilita a digitação.
using System.Collections.Generic;
namespace Recurso4
{
class Program
{
static void Main(string[] args)
{
// Inicializando o dicionario com uma coleção de inicialização
Dictionary<string, int> cientistas = new Dictionary<string, int> {
{"Galileo", 1564},
{"Magellan", 1480},
{"Voltaire", 1694},
{"Kepler", 1571},
{"Keaton", 1895}
};
//usando a nova forma de inicializar dicionarios
Dictionary<string, int> celebridades = new Dictionary<string, int>
{
["Galileo"] = 1564,
["Magellan"] = 1480,
["Voltaire"] = 1694,
["Kepler"] = 1571,
["Keaton"] = 1895
};
}
}
}
|
Pode parecer que não existe muita diferença, mas a nova sintaxe poupa tempo de digitação e é mais fácil de ler.
Até o próximo artigo C#.
"E esta é a mensagem que dele ouvimos, e
vos anunciamos: que Deus é luz, e não há nele trevas nenhumas. "
1 João 1:5
Veja os
Destaques e novidades do SUPER DVD Visual Basic
(sempre atualizado) : clique e confira !
Quer migrar para o VB .NET ?
Quer aprender C# ??
Quer aprender os conceitos da Programação Orientada a objetos ? Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ? |
Referências:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
Super DVD C# - Recursos de aprendizagens e vídeo aulas para C#
Curso Fundamentos da Programação Orientada a Objetos com VB .NET
Visual Basic 14 - Novidades da Nova Versão - III - Macoratti.net
Visual C# 6.0 - Novidades da nova versão ... - Macoratti.net