O que há de novo no C # 10?

Maria Vonotna / Shutterstock. com
C # 10 foi lançado em novembro de 2021 junto com o Visual Studio 2022 e . NET 6. Ele adiciona vários novos recursos que o tornam mais fácil e conveniente de trabalhar. Aqui está um tour por algumas das adições mais úteis e como elas irão melhorar seu fluxo de trabalho.
Namespaces com escopo de arquivo
Vamos começar com uma das alterações mais simples, mas talvez mais significativas. Agora você pode aplicar um namespace a um arquivo inteiro por meio de uma nova opção de sintaxe para a palavra-chave namespace. O código restante dentro do arquivo terá um namespace automaticamente, mesmo se não estiver indentado dentro de um bloco de namespace. Isso funciona de forma semelhante às declarações de namespace em PHP.
No C # 9, você precisava deste código para criar um namespace para uma classe:
Demonstração do namespace & # 123; publicclass Exemplo & # 123; & # 125; & # 125;
No C # 10, você pode usar o seguinte:
namespaceDemo; Exemplo de publicclass & # 123; & # 125;
Isso economiza algum espaço horizontal em seu editor cortando um nível de recuo. Se o arquivo precisar conter várias classes, você pode escrevê-las todas começando na coluna zero – a declaração de namespace se aplica a todo o arquivo.
Usos globais
Alguns namespaces são usados amplamente em projetos. No entanto, você ainda precisa incluí-los manualmente em cada arquivo com uma instrução using.
Publicidade
C # 10 muda isso para oferecer suporte a uma variante de uso global. Isso tornará o namespace referenciado acessível em todos os arquivos em seu projeto.
global usingSystem;
Usos globais podem ser adicionados a qualquer arquivo que será incluído em sua compilação. Eles oferecem suporte a todos os recursos de instruções de uso padrão, incluindo a palavra-chave estática e aliasing com =.
A adoção de usos globais reduzirá o número de linhas que você escreve, mas eles ainda são mais bem reservados para namespaces comumente referenciados que apresentam pouca chance de colisões de nomes. Esteja ciente de que contar com um uso global pode tornar seu código mais opaco, pois novos contribuidores podem não perceber imediatamente como um recurso com namespace foi incluído.
Um recurso complementar aos usos globais são os usos implícitos. Isso cria automaticamente o global usando instruções apropriadas para o tipo do seu projeto. O recurso é ativado por padrão nos modelos de projeto . NET 6. Ele pode ser desativado com a configuração ImplicitUsings em seu arquivo . csproj.
Estruturas aprimoradas
As estruturas receberam vários aprimoramentos que as aproximam das classes. Isso inclui construtores sem parâmetros, inicializadores de campo, suporte completo para expressões com e a opção de criar estruturas de registro:
Ponto de registro público & # 40; int X, int Y & # 41 ;;
Este exemplo cria uma “ posicional ” estrutura de registro em que os parâmetros do construtor X e Y tornam-se membros públicos implícitos. Você também pode definir manualmente os membros usando a sintaxe existente:
struct de registro público Point & # 123; publicint X & # 123; get; init; & # 125; publicint Y & # 123; get; init; & # 125; & # 125;
Publicidade
Uma estrutura de registro deve ser usada em cenários onde você precisa encapsular alguns dados sem anexar comportamentos personalizados como métodos de classe. Uma estrutura de registro oferece verificações de igualdade de valor integrado e recursos como ToString (). Ele pode ser mutável ou imutável por meio da palavra-chave somente leitura.
Aprimoramentos de expressão lambda
C # 10 adiciona várias melhorias às expressões lambda, abrangendo seus tipos e sintaxe. O objetivo é tornar lambdas mais parecidos com métodos regulares e funções locais. Definir um agora será uma experiência mais familiar.
O conceito de um “ natural ” tipo foi introduzido. Isso permite que o compilador inferir o tipo de um lambda sem convertê-lo manualmente em um delegado ou expressão. Isso cria um código mais legível ao atribuir um lambda a uma variável:
// Função C # 9 < string, int > toInt = & # 40; string s & # 41; = > int. Parse & # 40; s & # 41 ;; // C # 10var toInt = & # 40; string s & # 41; = > int. Parse & # 40; s & # 41;
O compilador inferirá o tipo de toInt como Func < string, int > e isso será exibido quando você visualizar o código no Visual Studio. As inferências usarão Func, Action ou delegados sintetizados.
Tipos naturais só funcionarão quando sua expressão lambda já estiver totalmente digitada. Se você omitir os tipos de parâmetro, o compilador não será capaz de criar uma definição de tipo compatível.
Uma mudança relacionada é o suporte para tipos de retorno explícitos. Como com uma função regular, o tipo de retorno vai antes da lista de parâmetros do lambda:
var toInt = int & # 40; string s & # 41; = > int. Parse & # 40; s & # 41;
Finalmente, lambdas agora podem receber atributos da mesma maneira que métodos e funções. Eles são reposicionados no início da expressão lambda, antes do tipo de retorno e da lista de parâmetros. Você pode usar atributos para anexar metadados extras aos seus lambdas para facilitar uma maior introspecção e análise de código.
var toInt = & # 91; DemoAttribute & # 40; & # 41; & # 93; int & # 40; string s & # 41; = > int. Parse & # 40; s & # 41;
Atribuições desconstruídas versáteis
As atribuições de desconstrução podem agora inicializar novas variáveis e atribuir valores às existentes na mesma linha. Anteriormente, você precisava usar desconstruções separadas para essas operações.
Publicidade
Em C # 9, isso resultou em um código semelhante a este:
int x = 0; int y = 0; & # 40; x, y & # 41; = ponto; & # 40; int z & # 41; = ponto;
Enquanto no C # 10, você pode fazer isso:
int x = 0; int y = 0; & # 40; x, y, int z & # 41; = ponto;
Agora x, y e z serão todos inicializados com valores usando a atribuição de desconstrução única, reduzindo a repetição em seu código.
Outras mudanças
A interpolação de strings foi melhorada e agora também funciona com strings constantes. Você precisa garantir que todas as strings usadas para preencher os buracos do marcador durante a interpolação sejam, elas mesmas, valores constantes. De forma mais ampla, as otimizações do processo de interpolação podem reduzir o uso de memória e aumentar o desempenho por meio do uso de manipuladores dedicados.
Os padrões de propriedade foram simplificados para fornecer acesso mais legível às propriedades aninhadas. Agora você pode usar a sintaxe de ponto para acessar valores de propriedade aninhados, em vez de várias camadas de parênteses:
// C # 9 & # 123; Trem: & # 123; Hora de chegada: " 10h " & # 125; & # 125; // C # 10 & # 123; Train. ArrivalTime: " 10h " & # 125;
Em outros lugares, as otimizações do compilador significam que você se beneficiará de menos falsos positivos durante a atribuição definida e as verificações de estado nulo. Vários problemas do C # 9 que dispararam avisos falsos em tempo de compilação foram resolvidos, resultando em verificações mais precisas e mais bem equipadas para ajudá-lo a depurar problemas que realmente importam. Os problemas estavam ligados ao uso de expressões coalescentes nulas e comparações de variáveis com constantes booleanas.
Conclusão
C # 10 adiciona vários novos recursos que ajudarão a tornar o desenvolvimento mais direto. No entanto, muitos outros novos recursos, incluindo a palavra-chave do campo e propriedades obrigatórias, foram adiados para a próxima versão principal. Atributos genéricos e membros abstratos estáticos para interfaces transformados em 10, mas com a tag de visualização ainda anexada.
Publicidade
Você pode começar a usar C # 10 hoje baixando o Visual Studio 2022. A linguagem também está disponível como parte do . NET 6 SDK autônomo que funciona em Windows, Mac e Linux.
Nenhum comentário