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:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
Padrão de Projeto - DAO - Data Access Object - Macoratti.net
Visual Studio - Dica de produtividade - Quick Launch - Macoratti.net
Visual Studio - Dica de produtividade - Nuget - Macoratti.net
SQL - Álgebra Relacional - Conceitos básicos - Macoratti.net