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:


José Carlos Macoratti