C# - Cinco recursos importantes que você tem que saber


Hoje vamos recordar cinco recursos importantes já implementados na linguagem C# que você tem que conhecer.

Recurso bom é aquele que otimiza o código e que a gente usa. De nada adianta saber que o recurso existe se você não o utiliza. Certo ?

Pensando nesses termos vamos recordar e incentivar o uso de cinco recursos importantes que não são novos na linguagem C# mas que podem não estar sendo utilizados.

Para exemplificar o código usado no artigo vamos usar o Visual Studio Community 2019 e criar um projeto do tipo Console Application para .NET Core:

Os recursos apresentandos necessitam da versão 6.0 em diante do C#.

1- Expression Bodies Methods

Quantas vezes você teve que escrever um método usando apenas  uma linha de código ?

Sabia que você pode simplesmente criar um membro incorporado de expressão apenas com a expressão e sem as chavetas ou retornos explícitos ?

Sim, agora podemos implementar propriedades somente leitura e métodos através das expressões lambdas.

A sintaxe é : membro => expressão

    public class CalculaVenda
    {
        // Método usando somente expressão
        public static int CalculaValorImposto(int percentual) => percentual * 30;
        // Exibe um texto no console
        public void Exibir() => WriteLine("Olá, Macoratti");
    
        // Invoca outro método
        public void Invocar() => Exibir();

        // Possui dois parâmetros e retorna a soma mais 100
        // Não precisa usar Return
        public int Somar(int a, int b) => a + b + 100;
    }

2- Operador de acesso condicional: ?.

Você ainda faz a verificação explicita da condição NULL antes de usar um objeto ou propriedade ?

Algumas vezes temos que fazer o tratamento de valores null, checando explicitamente a condição null antes de poder usar um objeto, e isso pode se tornar um pesadelo e tornar o código longo e difícil de ler.
 

No trecho de código a seguir estamos fazendo uma conexão remota com um banco de dados e estamos tentando manipular alguns registros de uma tabela.
 

   if(dbConnection != null && dbConnection.Table != null && dbConnection.Table.Records != null)
   {
      Return dbConnection.Table.Records.Count;
   }


Podemos usar o operador ?. (conhecido como Elvis) para verificar se a instância é null antes de chamar o método ou propriedade.
 

Neste tipo de cenário ás vezes precisamos realizar um monte de verificações de valores null para evitar o lançamento de exceções, e neste cenário podemos usar o operador ?. :

   if(dbConnection?.Table?.Records)
   {
      Return dbConnection.Table.Records.Count;
   }

Usando o operador condicional null(?.) podemos tornar o código menor, mais elegante e mais fácil de ler:

3- Inicialização automática de propriedades

Usando o recurso da inicialização automática de propriedades você pode inicializar propriedades sem usar um conjunto privado ou a necessidade de uma ter uma variável local.

   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());
    }

Menos código, mais desempenho, menor probabilidade de erro.

4- Declaração do parâmetro OUT durante a chamada do método

Esse recurso permite que você declare o parâmetro OUT durante a chamada do método, como mostrado abaixo.

       public bool ConverteParaIntVerificaSeMaiorQue10(string value)
        {
            if (int.TryParse(value, out int valorConvertido)
&& valorConvertido > 10)
            {
                return true;
            }
            return false;
        }

Estou declarando valorConvertido na chamada e fazendo a verificação.

5- Usar await em um bloco catch

No C# 6.0 em diante, podemos usar a palavra-chave await dentro dos blocos catch e finally.

    try  
    {  
        throw new Exception();  
    }  
    catch  
    {  
        await Task.Delay(1000);  
    }  
    finally  
    {  
        await Task.Delay(1000);    
    }  

 

Isso abre o caminho para executar um processo de manipulação ou fallback de exceção assíncrona, caso ocorra uma exceção durante uma chamada de processo assíncrona.

      public async void Processa()
        {
            try
            {
                Processor processor = new Processor();
             
  await processor.ProcessaAsync();
            }
            catch (Exception exception)
            {
                ExceptionLogger logger = new ExceptionLogger();
                // A operação de captura de erros também pode ser async agora
              
 await logger.HandleExceptionAsync(exception);
            }
        }

Estes são os cinco recursos que podem te ajudar a escrever um código melhor.

"Vós me chamais Mestre e Senhor, e dizeis bem, porque eu o sou.
Ora, se eu, Senhor e Mestre, vos lavei os pés, vós deveis também lavar os pés uns aos outros.
Porque eu vos dei o exemplo, para que, como eu vos fiz, façais vós também."
João 13:13-15

Referências:


José Carlos Macoratti