C# - Cinco recursos indispensáveis da linguagem


Neste artigo vamos recordar cinco recursos da linguagem C# que são (quase) indispensáveis.

A linguagem C# tem evoluído ao longo dos anos para tornar-se a linguagem  padrão para a todas as plataformas que usam o runtime .NET. Mesmo sem alterações mais expressivas, as duas últimas versões incluiram recursos que tornam o código mais expressivo, conciso e sustentável.

Veremos a seguir 5 desses principais recursos que vieram para se firmar como indispensáveis no dia a dia.

1- Interpolação de Strings (C# 6.0)

Um recurso simples que é fundamental para simplificar o código.

Ao invés de concatenar strings ou usar placeholders com base na posição ordinal:

var titulo = "Srta"
var nome = "Maria Silva"
var sobrenome = "Mendonça"

var nomeCompleto1 = String.Format("{0} {1} {2}", titulo, nome, sobrenome );

var nomeCompleto2 = titulo + " " +  nome + "  " + sobrenome
 

Podemos simplesmente fazer assim:


  var nomeCompleto = $"{titulo} {nome} {sobrenome}";
 

Além de criar um código mais legível o recurso também é de alto desempenho, pois o IL gerado mostra que é feita uma chamada para System.String.Format que usa a classe StringBuilder.

2- Auto Property Initializer (C# 6.0)

Outro recurso que torna o código conciso e legível é o recurso Inicializadores automáticos de propriedades:

Muitas vezes precisamos inicializar os valores padrão no construtor de uma classe:

    public class Cliente
    {
        public int Id { get; set; }
        public ICollection<Pedido> Pedidos { get; set; }
        public DateTime DataPedido{ get; set; }
        public Cliente()
        {
            Pedidos = new List<Pedido>();
            DataPedido = DateTime.Now;
        }
    }

Usando o recurso da inicialização automática das propriedades o código fica mais conciso e legível também.

public class Cliente
{
        public int Id { get; set; }
        public string Nome { get; set; }
        public ICollection<Pedido> Pedidos { get; set; } = new List<Pedido>();
        public DateTime DataPedido { get; set; } = DateTime.Now;
}

No exemplo, a inicialização de uma coleção vazia reduz a chance de obtermos referências nulas e é uma responsabilidade da classe que a declara.

3- Expression Bodied Members (C# 6.0)

Uma das tarefas mais tediosas para qualquer desenvolvedor é ter que criar um getter de propriedade apenas para oferecer uma propriedade computada básica, como a combinação de um nome e um sobrenome. O recurso 'Membros com corpo de expressão' nos oferece uma sintaxe nova e abreviada para tais situações.

A seguir exemplos do uso deste recurso:


  public string NomeCompleto => $"{nome} {sobrenome}";
 

Particularmente útil para funções com fórmulas matemáticas:


  public decimal CalculoImposto (decimal percentual) => TotalVendas * percentual / 100 ;

 

Combinando com o exemplo anterior temos:

public class Cliente
{
        public int Id { get; set; }
        public string Nome { get => Nome }
        public ICollection<Pedido> Pedidos { get; set; } = new List<Pedido>();
        public DateTime DataPedido { get; set; } = DateTime.Now;
        public void Exibir() => Imprimir();
        private void Imprimir() => 
        {
           WriteLine($"{Nome}");
        }

        public decimal TotalVendas { get; private set; }
        public decimal CalculoImposto(decimal percentual) => TotalVendas * percentual / 100;
}

Note que estamos definindo um acessor get em Nome onde a palavra return não é necessária, e, estamos definindo o método Exibir() em uma única instrução.

4- Nameof (C# 6.0)

O operador nameof é usado para obter o nome string de uma variável, membro ou tipo. Ele pode tomar os seguintes parâmetros: nome de classes,  membros de classes,  nomes de métodos e variáveis

Este recurso permite obter o nome de uma variável em tempo de execução eliminando assim o uso de strings fixas que são mais sujeitas a erros.

Exemplos de  uso:

- validação de parâmetros

void Teste(string s) {
   if (s == null) throw new ArgumentNullException(nameof(s));
}

- com INotifyPropertyChanged

int Prop {
   get { return this.Prop; }
   set { this.Prop = value; PropertyChanged(this, new PropertyChangedEventsArgs(nameof(this.Prop));}  
}

- com Log

void Teste(int i) {
          Log(nameof(f), "método Teste");
}

- com Atributos

[DebuggerDisplay("={" + nameof(GetString) + "()}")]
class Teste {
    string GetString() { }
}

Um recurso que parece muito simples mas que ajuda muito.

5- Tuples (ValueTuples C# 7.0)

Uma grande limitação do C# era a falta de uma maneira fácil de retornar vários valores de um método.
Embora seja possível usar parâmetros out ou criar uma classe para manter os valores de retorno, a primeira solução cria um fluxo de código que não é elegante e a segundo cria um nível de obstrução que simplesmente não existem em muitas outras linguagens.

Com o novo recurso ValueTuple, finalmente temos um recurso seguro, assim como uma sintaxe expressiva e intuitiva, pelo qual podemos fazer isso.

Nota: Se você estiver usando o .Net Framework 4.6.2 ou anterior, será necessário incluir o pacote nuget System.ValueTuple no seu projeto,, caso contrário, você obterá um erro.

    class Program
    {
        static void Main(string[] args)
        {
            int a = 30;
            int b = 30;
            (int soma, int multiplicacao) = Calcula(a, b);
            Console.WriteLine($" 30 + 30 = {soma}  e   30 x 30 = {multiplicacao} ");
            Console.ReadLine();
        }
        private static (int, int) Calcula(int a, int b)
        {
            return (a + b, a * b);
        }
    }

Para mais detalhes sobre esse novo recurso veja o meu artigo:  C# - Novidades da versão 7 - II - Macoratti

Embora pareçam simples esses recursos tornam o seu código mais simples, fácil de ler e de manter.

Ninguém jamais viu a Deus; o Deus unigênito (Jesus), que está no seio do Pai, é quem o revelou.
João 1:17,18

Referências:


José Carlos Macoratti