A história da C#

Este artigo fornece um histórico de cada versão principal da linguagem C#. A equipe do C# continua inovando e adicionando novos recursos. O status detalhado dos recursos de linguagem, incluindo os recursos considerados para os próximos lançamentos, pode ser encontrado no repositório dotnet/roslyn no GitHub.

Importante

A linguagem C# depende de tipos e métodos no que a especificação C# define como uma biblioteca padrão para alguns dos recursos. A plataforma .NET fornece esses tipos e métodos em vários pacotes. Um exemplo é o processamento de exceções. Cada throw instrução ou expressão é verificada para garantir que o objeto que está sendo lançado seja derivado de Exception. Da mesma forma, todos são catch verificados para garantir que o tipo que está sendo capturado é derivado de Exception. Cada versão pode adicionar novos requisitos. Para usar os recursos de idioma mais recentes em ambientes mais antigos, talvez seja necessário instalar bibliotecas específicas. Essas dependências são documentadas na página para cada versão específica. Você pode aprender mais sobre as relações entre idioma e biblioteca para obter informações sobre essa dependência.

C# versão 12

Lançado em novembro de 2023

Os seguintes recursos foram adicionados ao C# 12:

  • Construtores primários - Você pode criar construtores primários em qualquer class um ou struct tipo.
  • Expressões de coleção - Uma nova sintaxe para especificar expressões de coleção, incluindo o operador spread, (..), para expandir qualquer coleção.
  • Matrizes embutidas - As matrizes embutidas permitem criar uma matriz de tamanho fixo em um struct tipo.
  • Parâmetros opcionais em expressões lambda - Você pode definir valores padrão para parâmetros em expressões lambda.
  • ref readonly parâmetros - ref readonly permite mais clareza para APIs que podem estar usando ref parâmetros ou in parâmetros.
  • Alias any type - Você pode usar a using diretiva alias para alias qualquer tipo, não apenas tipos nomeados.
  • Atributo experimental - Indica uma característica experimental.

E, Interceptors - foi lançado como um recurso de visualização.

No geral, o C# 12 fornece novos recursos que tornam você mais produtivo escrevendo código C#. A sintaxe que você já conhecia está disponível em mais lugares. Outra sintaxe permite consistência para conceitos relacionados.

C# versão 11

Lançado em novembro de 2022

Os seguintes recursos foram adicionados ao C# 11:

O C# 11 introduz matemática genérica e vários recursos que suportam esse objetivo. Você pode escrever algoritmos numéricos uma vez para todos os tipos de números. Há mais recursos para facilitar o trabalho com struct tipos, como membros necessários e estruturas padrão automáticas. Trabalhar com cadeias de caracteres fica mais fácil com literais de cadeia de caracteres brutos, nova linha em interpolações de cadeia de caracteres e literais de cadeia UTF-8. Recursos como tipos locais de arquivos permitem que os geradores de origem sejam mais simples. Finalmente, os padrões de lista adicionam mais suporte para correspondência de padrões.

C# versão 10

Lançado em novembro de 2021

O C# 10 adiciona os seguintes recursos e aprimoramentos à linguagem C#:

Mais recursos estavam disponíveis no modo de visualização . Para usar esses recursos, você deve definir <LangVersion> como Preview em seu projeto:

O C# 10 continua trabalhando em temas de remoção de cerimônia, separação de dados de algoritmos e desempenho aprimorado para o .NET Runtime.

Muitos dos recursos significam que você digita menos código para expressar os mesmos conceitos. As estruturas de gravação sintetizam muitos dos mesmos métodos que as classes de gravação. Estruturas e tipos anônimos suportam com expressões. O uso global de diretivas e declarações de namespace com escopo de arquivo significa que você expressa dependências e organização de namespace com mais clareza. As melhorias do Lambda facilitam a declaração de expressões lambda onde elas são usadas. Novos padrões de propriedade e melhorias de desconstrução criam um código mais conciso.

Os novos manipuladores de cadeia de caracteres interpolados e AsyncMethodBuilder o comportamento podem melhorar o desempenho. Esses recursos de linguagem foram aplicados no .NET Runtime para obter melhorias de desempenho no .NET 6.

O C# 10 também marca mais uma mudança para a cadência anual para versões do .NET. Como nem todos os recursos podem ser concluídos em um período anual, você pode tentar alguns recursos de "visualização" no C# 10. Atributos genéricos e membros abstratos estáticos em interfaces podem ser usados, mas esses recursos de visualização podem mudar antes de sua versão final.

C# versão 9

Lançado em novembro de 2020

O C# 9 foi lançado com o .NET 5. É a versão de idioma padrão para qualquer assembly destinado à versão .NET 5. Ele contém os seguintes recursos novos e aprimorados:

O C# 9 continua três dos temas das versões anteriores: remover cerimônia, separar dados de algoritmos e fornecer mais padrões em mais lugares.

Declarações de alto nível significa que seu programa principal é mais simples de ler. Há menos necessidade de cerimônia: um namespace, uma Program classe, e static void Main() são todos desnecessários.

A introdução de fornece uma sintaxe concisa para tipos de referência que seguem semântica de records valor para igualdade. Você usa esses tipos para definir contêineres de dados que normalmente definem o comportamento mínimo. Os setters somente de inicialização fornecem a capacidade de mutação não destrutiva (with expressões) em registros. O C# 9 também adiciona tipos de retorno covariante para que os registros derivados possam substituir métodos virtuais e retornar um tipo derivado do tipo de retorno do método base.

Os recursos de correspondência de padrões se expandiram de várias maneiras. Os tipos numéricos agora suportam padrões de intervalo. Os padrões podem ser combinados usando and, ore not padrões. Parênteses podem ser adicionados para esclarecer padrões mais complexos:

O C# 9 inclui novas melhorias de correspondência de padrões:

  • Os padrões de tipo correspondem a um objeto que corresponde a um tipo específico
  • Padrões entre parênteses impõem ou enfatizam a precedência de combinações de padrões
  • Os padrões conjuntivos and exigem que ambos os padrões correspondam
  • Os padrões disjuntivos or exigem que qualquer um dos padrões corresponda
  • Padrões negados not exigem que um padrão não corresponda
  • Os padrões relacionais exigem que a entrada seja menor, maior que, menor ou igual, ou maior ou igual a uma determinada constante

Esses padrões enriquecem a sintaxe dos padrões. Considere estes exemplos:

public static bool IsLetter(this char c) =>
    c is >= 'a' and <= 'z' or >= 'A' and <= 'Z';

Com parênteses opcionais para deixar claro que tem maior precedência do orqueand:

public static bool IsLetterOrSeparator(this char c) =>
    c is (>= 'a' and <= 'z') or (>= 'A' and <= 'Z') or '.' or ',';

Um dos usos mais comuns é uma nova sintaxe para uma verificação nula:

if (e is not null)
{
    // ...
}

Qualquer um desses padrões pode ser usado em qualquer contexto onde os padrões são permitidos: is expressões de padrão, switch expressões, padrões aninhados e o padrão do rótulo de uma switch instrução case .

Outro conjunto de recursos suporta computação de alto desempenho em C#:

  • Os nint tipos e nuint modelam os tipos inteiros de tamanho nativo na CPU de destino.
  • Os ponteiros de função fornecem funcionalidade semelhante a delegado, evitando as alocações necessárias para criar um objeto delegado.
  • A localsinit instrução pode ser omitida para salvar instruções.

Desempenho e interoperabilidade

Outro conjunto de melhorias suporta cenários em que geradores de código adicionam funcionalidade:

  • Os inicializadores de módulo são métodos que o tempo de execução chama quando um assembly é carregado.
  • Os métodos parciais suportam novos modificadores acessíveis e tipos de retorno não anuláveis. Nesses casos, deve ser fornecida uma implementação.

Características de ajuste e acabamento

O C# 9 adiciona muitos outros pequenos recursos que melhoram a produtividade do desenvolvedor, tanto escrevendo quanto lendo código:

  • Expressões do tipo new de destino
  • static funções anónimas
  • Expressões condicionais do tipo de destino
  • Suporte de extensão GetEnumerator() para foreach loops
  • As expressões do Lambda podem declarar parâmetros de descarte
  • Os atributos podem ser aplicados a funções locais

A versão C# 9 continua o trabalho para manter o C# uma linguagem de programação moderna e de uso geral. Os recursos continuam a oferecer suporte a cargas de trabalho modernas e tipos de aplicativos.

C# versão 8.0

Lançado em setembro de 2019

O C# 8.0 é a primeira versão principal do C# que visa especificamente o .NET Core. Alguns recursos dependem de novos recursos CLR (Common Language Runtime), outros de tipos de biblioteca adicionados somente no .NET Core. O C# 8.0 adiciona os seguintes recursos e aprimoramentos à linguagem C#:

Os membros da interface padrão exigem aprimoramentos no CLR. Esses recursos foram adicionados no CLR para .NET Core 3.0. Intervalos e índices e fluxos assíncronos exigem novos tipos nas bibliotecas do .NET Core 3.0. Tipos de referência anuláveis, embora implementados no compilador, são muito mais úteis quando as bibliotecas são anotadas para fornecer informações semânticas sobre o estado nulo de argumentos e valores de retorno. Essas anotações estão sendo adicionadas nas bibliotecas do .NET Core.

C# versão 7.3

Lançado em maio de 2018

Há dois temas principais para a versão do C# 7.3. Um tema fornece recursos que permitem que o código seguro tenha o mesmo desempenho que o código não seguro. O segundo tema fornece melhorias incrementais aos recursos existentes. Novas opções de compilador também foram adicionadas nesta versão.

Os seguintes novos recursos suportam o tema de melhor desempenho para código seguro:

  • Você pode acessar campos fixos sem fixar.
  • Você pode reatribuir ref variáveis locais.
  • Você pode usar inicializadores em stackalloc matrizes.
  • Você pode usar fixed instruções com qualquer tipo que ofereça suporte a um padrão.
  • Você pode usar restrições mais genéricas.

Os seguintes aprimoramentos foram feitos nos recursos existentes:

  • Você pode testar == e != com tipos de tupla.
  • Você pode usar variáveis de expressão em mais locais.
  • Você pode anexar atributos ao campo de suporte de propriedades implementadas automaticamente.
  • A resolução do método quando os argumentos diferem por in foi melhorada.
  • A resolução de sobrecarga tem agora menos casos ambíguos.

As novas opções do compilador são:

  • -publicsign para habilitar a assinatura de assemblies por Software de Código Aberto (OSS).
  • -pathmap para fornecer um mapeamento para diretórios de origem.

C# versão 7.2

Lançado em novembro de 2017

O C# 7.2 adicionou vários recursos de linguagem pequena:

  • Inicializadores em stackalloc matrizes.
  • Use fixed instruções com qualquer tipo que ofereça suporte a um padrão.
  • Aceda a campos fixos sem fixar.
  • Reatribuir ref variáveis locais.
  • Declare readonly struct types, para indicar que um struct é imutável e deve ser passado como um in parâmetro para seus métodos membros.
  • Adicione o in modificador em parâmetros, para especificar que um argumento é passado por referência, mas não modificado pelo método chamado.
  • Use o ref readonly modificador em retornos de método, para indicar que um método retorna seu valor por referência, mas não permite gravações nesse objeto.
  • Declare ref struct types, para indicar que um tipo struct acessa a memória gerenciada diretamente e sempre deve ser alocado em pilha.
  • Use restrições genéricas adicionais.
  • Argumentos nomeados não à direita:
    • Os argumentos posicionais podem seguir argumentos nomeados.
  • Sublinhados principais em literais numéricos:
    • Os literais numéricos agora podem ter sublinhados à esquerda antes de qualquer dígito impresso.
  • private protected modificador de acesso:
    • O private protected modificador de acesso permite o acesso para classes derivadas no mesmo assembly.
  • Expressões condicionais ref :
    • O resultado de uma expressão condicional (?:) agora pode ser uma referência.

C# versão 7.1

Lançado em agosto de 2017

O C# começou a lançar versões pontuais com o C# 7.1. Esta versão adicionou o elemento de configuração de seleção de versão de idioma, três novos recursos de linguagem e novo comportamento do compilador.

Os novos recursos de idioma nesta versão são:

  • asyncMain método
    • O ponto de entrada para um aplicativo pode ter o async modificador.
  • default expressões literais
    • Você pode usar expressões literais padrão em expressões de valor padrão quando o tipo de destino pode ser inferido.
  • Nomes de elementos de tupla inferidos
    • Os nomes dos elementos da tupla podem ser inferidos a partir da inicialização da tupla em muitos casos.
  • Correspondência de padrões em parâmetros de tipo genéricos
    • Você pode usar expressões de correspondência de padrão em variáveis cujo tipo é um parâmetro de tipo genérico.

Finalmente, o compilador tem duas opções -refout e -refonly que controlam a geração de assembly de referência.

C# versão 7.0

Lançado em março de 2017

A versão 7.0 do C# foi lançada com o Visual Studio 2017. Esta versão tem algumas coisas evolutivas e legais na veia do C# 6.0. Aqui estão algumas das novas funcionalidades:

Outras características incluídas:

Todos esses recursos oferecem novos recursos para desenvolvedores e a oportunidade de escrever código mais limpo do que nunca. Um destaque é condensar a declaração de variáveis para usar com a out palavra-chave e permitir múltiplos valores de retorno via tupla. O .NET Core agora tem como alvo qualquer sistema operacional e está de olho na nuvem e na portabilidade. Essas novas capacidades certamente ocupam os pensamentos e o tempo dos designers de linguagem, além de criar novos recursos.

C# versão 6.0

Lançado em julho de 2015

A versão 6.0, lançada com o Visual Studio 2015, lançou muitos recursos menores que tornaram a programação em C# mais produtiva. Eis algumas delas:

Outras novas funcionalidades incluem:

  • Inicializadores de índice
  • Aguarde na captura / finalmente blocos
  • Valores padrão para propriedades getter-only

Se você olhar para esses recursos juntos, verá um padrão interessante. Nesta versão, o C# começou a eliminar a linguagem clichê para tornar o código mais conciso e legível. Então, para os fãs de código limpo e simples, esta versão em linguagem foi uma grande vitória.

Eles fizeram uma outra coisa junto com esta versão, embora não seja um recurso de linguagem tradicional em si. Eles lançaram Roslyn o compilador como um serviço. O compilador C# agora está escrito em C#, e você pode usar o compilador como parte de seus esforços de programação.

C# versão 5.0

Lançado em agosto de 2012

C# versão 5.0, lançado com o Visual Studio 2012, era uma versão focada da linguagem. Quase todo o esforço para essa versão foi para outro conceito de linguagem inovador: o modelo e await para programação assíncronaasync. Aqui está a lista dos principais recursos:

O atributo caller info permite que você recupere facilmente informações sobre o contexto no qual você está executando sem recorrer a uma tonelada de código de reflexão clichê. Ele tem muitos usos em tarefas de diagnóstico e registro.

Mas async e await são as verdadeiras estrelas deste lançamento. Quando esses recursos foram lançados em 2012, o C# mudou o jogo novamente, incorporando assincronia na linguagem como um participante de primeira classe.

C# versão 4.0

Lançado em abril de 2010

C# versão 4.0, lançado com o Visual Studio 2010, introduziu alguns novos recursos interessantes:

Os tipos de interoperabilidade incorporados aliviaram a dificuldade de implantação da criação de assemblies de interoperabilidade COM para seu aplicativo. Covariância e contravariância genéricas dão mais poder para usar genéricos, mas eles são um pouco acadêmicos e provavelmente mais apreciados por autores de estruturas e bibliotecas. Os parâmetros nomeados e opcionais permitem eliminar muitas sobrecargas de método e fornecer conveniência. Mas nenhuma dessas características é exatamente uma mudança de paradigma.

A principal característica foi a introdução da dynamic palavra-chave. A dynamic palavra-chave introduziu no C# versão 4.0 a capacidade de substituir o compilador na digitação em tempo de compilação. Usando a palavra-chave dynamic, você pode criar construções semelhantes a linguagens digitadas dinamicamente, como JavaScript. Você pode criar um dynamic x = "a string" e, em seguida, adicionar seis a ele, deixando para o tempo de execução para resolver o que deve acontecer em seguida.

A ligação dinâmica dá-lhe o potencial para erros, mas também um grande poder dentro da linguagem.

C# versão 3.0

Lançado em novembro de 2007

C# versão 3.0 veio no final de 2007, juntamente com o Visual Studio 2008, embora o barco completo de recursos de linguagem viria realmente com o .NET Framework versão 3.5. Esta versão marcou uma grande mudança no crescimento do C#. Ele estabeleceu o C# como uma linguagem de programação verdadeiramente formidável. Vamos dar uma olhada em alguns dos principais recursos desta versão:

Em retrospetiva, muitas dessas características parecem inevitáveis e inseparáveis. Todos eles se encaixam estrategicamente. O recurso assassino desta versão do C# era a expressão de consulta, também conhecida como LINQ (Language-Integrated Query).

Uma visão mais matizada examina árvores de expressão, expressões lambda e tipos anônimos como a base sobre a qual o LINQ é construído. Mas, em ambos os casos, o C# 3.0 apresentou um conceito revolucionário. O C# 3.0 começou a lançar as bases para transformar o C# em uma linguagem híbrida orientada a objetos / funcional.

Especificamente, agora você pode escrever consultas declarativas no estilo SQL para executar operações em coleções, entre outras coisas. Em vez de escrever um for loop para calcular a média de uma lista de inteiros, agora você pode fazer isso tão simplesmente quanto list.Average(). A combinação de expressões de consulta e métodos de extensão tornou uma lista de inteiros muito mais inteligente.

C# versão 2.0

Lançado em novembro de 2005

Vamos dar uma olhada em alguns dos principais recursos do C# 2.0, lançado em 2005, juntamente com o Visual Studio 2005:

Outros recursos do C# 2.0 adicionaram recursos aos recursos existentes:

  • Getter/setter acessibilidade separada
  • Conversões de grupo de métodos (delegados)
  • Classes estáticas
  • Delegar inferência

Enquanto o C# começou como uma linguagem genérica orientada a objetos (OO), o C# versão 2.0 mudou isso rapidamente. Com os genéricos, os tipos e métodos podem operar em um tipo arbitrário, mantendo a segurança do tipo. Por exemplo, ter um List<T> permite que você tenha List<string> ou List<int> execute operações seguras de tipo nessas cadeias de caracteres ou inteiros enquanto você itera através deles. Usar genéricos é melhor do que criar um ListInt tipo derivado ou ArrayList fundido Object para cada operação.

A versão 2.0 do C# trouxe iteradores. Sucintamente, os iteradores permitem examinar todos os itens em um List (ou outros tipos enumeráveis) com um foreach loop. Ter iteradores como uma parte de primeira classe da linguagem melhorou drasticamente a legibilidade da linguagem e a capacidade das pessoas de raciocinar sobre o código.

C# versão 1.2

Lançado em abril de 2003

C# versão 1.2 fornecido com o Visual Studio .NET 2003. Ele continha alguns pequenos aprimoramentos para a linguagem. O mais notável é que, a partir desta versão, o código gerado em um foreach loop chamado Dispose em um IEnumerator quando que IEnumerator implementou IDisposable.

C# versão 1.0

Lançado em janeiro de 2002

Quando você volta e olha, o C# versão 1.0, lançado com o Visual Studio .NET 2002, se parecia muito com Java. Como parte de seus objetivos de design declarados para a ECMA, ela procurou ser uma "linguagem simples, moderna e orientada a objetos de uso geral". Na época, parecer Java significava que ele atingia os primeiros objetivos de design.

Mas se você olhar para trás no C# 1.0 agora, você se encontrará um pouco tonto. Ele não tinha os recursos assíncronos integrados e algumas das funcionalidades lisas em torno de genéricos que você considera garantidos. De facto, faltavam-lhe genéricos. E o LINQ? Ainda não disponível. Essas adições levariam alguns anos para sair.

A versão 1.0 do C# parecia desprovida de recursos, em comparação com a atual. Você se encontraria escrevendo algum código detalhado. Mas ainda assim, você tem que começar em algum lugar. C# versão 1.0 era uma alternativa viável ao Java na plataforma Windows.

Os principais recursos do C# 1.0 incluem:

Artigopublicado originalmente no blog NDepend, cortesia de Erik Dietrich e Patrick Smacchia.