C# 10 - Cinco recursos que você tem que conhecer


Hoje vou apresentar cinco novos recursos do C# 10 que você tem a obrigação de conhecer.

Estamos a poucos dias do lançamento oficial do .NET 6 que vai apresentar muitos recursos,e , junto com ele o C# 10 também vem recheado de novidades.

Neste artigo, vou apresentar uma revisão dos 5 recursos do C# 10 que você tem que conhecer.

1- Os Tipos Record agora suportam ToString sealed

No C# 10, podemos adicionar o modificador sealed ao sobrescrever ToString em um tipo record.

Agora temos a possibilidade de selar o método ToString e isso evita que o compilador sintetize um método ToString para qualquer tipo de registro derivado. Esta função permite que você garanta que todos os tipos de registro derivados usem o método ToString definido em um tipo de registro de base comum.

O recurso record foi introduzido no C# 9.0. Para detalhes veja o meu artigo:  C# - Apresentando Records



O exemplo mostra um record Pessoa que implementa uma substituição do método ToString(). Essa substituição também é selada com a palavra-chave sealed.

A seguir o record Aluno herda de Pessoa e tenta substituir o método ToString(), o que dá um erro de compilação.

2- Declaração de namespace com escopo de arquivo

No C# 10 podemos usar a nova declaração namespace para definir que todas as declarações seguintes são membros do namespace declarado. (quanto declaração....)

Assim agora podemos utilizar um namespace para um arquivo inteiro ao invés de usar um bloco {}.

  namespace SeuNamespace;      
 

Essa nova sintaxe vai permitir economizar espaço vertical e horizontal para as declarações de namespace mais comuns além de permitir que você declare todos os tipos de um arquivo, que estão em um único namespace.

1- Usando a declaração namespace normal

     using System.ComponentModel.DataAnnotations;
      
     namespace Demo_Namespace
     {
        public partial class Aluno
        {
            [Key]
            public int Id { get; set; }
            public DateTime Idade { get; set; }
        }
    }

2- Usando a nova declaração namespace

     using System.ComponentModel.DataAnnotations;

     namespace Demo_Namespace;

     public partial class Aluno
     {
            [Key]
            public int Id { get; set; }
            public DateTime Idade { get; set; }
     }

3- Strings interpoladas constantes

Para entender as strings interpoladas constantes, primeiro precisamos entender a interpolação de strings.

O caractere $ identifica um literal de string como uma string interpolada. Uma string interpolada é uma string literal que pode conter expressões de interpolação.

Quando uma string interpolada é resolvida em uma string de resultado, os itens com expressões de interpolação são substituídos pelas representações de string dos resultados da expressão.

Perfeito, agora minha pergunta é….

O são as strings interpoladas constantes do C# 10 ?

Elementar meu caro, o novo recurso do C# 10 chamado de Constant Interpolated Strings permite realizar a interpolação de strings constantes definidas com a palavra-chave const.

A palavra-chave const pode ser usada para declarar um campo constante ou uma constante local. Campos e constantes locais  não são variáveis e não podem ser modificados. As constantes podem ser números, valores booleanos, cadeias de caracteres ou uma referência nula.

Assim ao usar strings const nas versões anteriores da linguagem C# a concatenação somente podia ser feita com o operador +.

Com o C# 10  agora podemos usar o operador de interpolação de strings ($) para combinar strings const.

Assim o código abaixo vai funcionar sem erros:

var teste = new Teste();
teste.Demo();

public class Teste
{
    public const string Saudacao = "Bem-Vindo ";
    public const string Titulo = "Srta. ";
    public const string Nome = "Amanda";

    public const string Saudacoes = $"\n{Saudacao}, {Titulo}{Nome} !\n";

    public void Demo()
    {
        Console.WriteLine(Saudacoes);
        Console.ReadKey();
    }
}

4- Padrões de propriedades estendidas

Primeiro, vejamos o que são os padrões de propriedade estendidos.

Esses padrões permitem que os sub-padrões de propriedade se refiram a membros aninhados, por exemplo podemos usar:


   if
(e is MethodCallExpression { Method.Name : "MethodName" })      
 

Ao invés de  :


   if
(e is MethodCallExpression { Method : { Name : "MethodName" })      
 

Agora o que são os padrões de propriedades estendidos do C# 10 ?

Assim o padrão permite que você corresponda às propriedades do objeto examinado e o  C# 10 melhora esse padrão simplificando o acesso às propriedades aninhadas.

Dessa forma no C# 10 os campos ou propriedades aninhados podem ser referenciados em um padrão de propriedade. Exemplo:

1- Antes

public class ImpostoDoEstadoProperty
{
    public string Estado { get; set; }
}

public class CalculaImposto
{
    public string Pais { get; set; }
    public ImpostoDoEstadoProperty ImpostoEstadoProperty { get; set; }
}

public class Calculo
{
    private static decimal CalcularPreco(CalculaImposto calcula, decimal preco) =>

    calcula switch
    {

        { ImpostoEstadoProperty.Estado: "SP" } } => 1.14975M * preco,
        { ImpostoEstadoProperty { Estado: "RJ" } } => 1.05M * preco,
        { ImpostoEstadoProperty: { Estado: "MG" } } => 1.13M * preco,

        _ => 0

    };
}

2- Agora o C# permite realizar o acesso diretamente a propriedade aninhada usando apenas um ponto (.):

public class ImpostoDoEstadoProperty
{
    public string Estado { get; set; }
}

public class CalculaImposto
{
    public string Pais { get; set; }
    public ImpostoDoEstadoProperty ImpostoEstadoProperty { get; set; }
}

public class Calculo
{
    private static decimal CalcularPreco(CalculaImposto calcula, decimal preco) =>

    calcula switch
    {

        { ImpostoEstadoProperty.Estado: "SP" } => 1.14975M * preco,
        { ImpostoEstadoProperty.Estado: "RJ" } => 1.05M * preco,
        { ImpostoEstadoProperty.Estado: "MG" } => 1.13M * preco,

        _ => 0

    };
}

5 - Global Using

O novo recurso do C# 10 chamado de Global Using tem como objetivo simplificar e tornar o código C# mais leve declarando apenas uma vez a diretiva using em um namespace específico em um mesmo projeto.

O novo recurso Global Using do C# 10 introduz a palavra-chave global que podemos usar para identificar diretivas using que deverão ser aplicados a todos os arquivos da solução.

global using System;
global using System.Collections.Generic;
global using System.Threading.Tasks;
global using Dapper;
global using AutoMapper;
...

Essas instruções podem ser colocadas em um arquivo separado em algum lugar do projeto, e o compilador C # saberá que todos esses namespaces se aplicam a todos os arquivos do projeto.

Você pode aplicar dois modificadores a uma diretiva using:

- O modificador global tem o mesmo efeito que adicionar a mesma diretiva using a todos os arquivos-fonte em seu projeto. Esse modificador foi introduzido no C# 10.

- O modificador static importa os membros estáticos e tipos aninhados de um único tipo, em vez de importar todos os tipos em um namespace.

"Portanto, irmãos, empenhem-se ainda mais para consolidar o chamado e a eleição de vocês, pois se agirem dessa forma, jamais tropeçarão, e assim vocês estarão ricamente providos quando entrarem no Reino eterno de nosso Senhor e Salvador Jesus Cristo."
2 Pedro 1:10,11


Referências:


José Carlos Macoratti