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 oustruct
tipo. - Expressões de coleção - Uma nova sintaxe para especificar expressões de coleção, incluindo o elemento spread, (
..e
), 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 usandoref
parâmetros ouin
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:
- Literais de cadeia de caracteres brutos
- Suporte matemático genérico
- Atributos genéricos
- Literais de cadeia UTF-8
- Novas linhas em expressões de interpolação de cadeia de caracteres
- Padrões de lista
- Tipos de arquivo local
- Membros obrigatórios
- Estruturas padrão automática
- Correspondência
Span<char>
de padrão em uma constantestring
- Âmbito alargado
nameof
- IntPtr numérico
ref
campos escoped ref
- Conversão de grupo de método melhorada para delegado
- Onda de alerta 7
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#:
- Estruturas de gravação
- Melhorias nos tipos de estrutura
- Manipuladores de cadeia de caracteres interpolados
global using
Diretivas- Declaração de namespace com escopo de arquivo
- Padrões de propriedade estendidos
- Melhorias nas expressões lambda
- Permitir
const
cadeias de caracteres interpoladas - Os tipos de registo podem selar
ToString()
- Atribuição definitiva melhorada
- Permitir atribuição e declaração na mesma desconstrução
- Permitir
AsyncMethodBuilder
atributo em métodos - Atributo CallerArgumentExpression
- Pragma melhorado
#line
Mais recursos estavam disponíveis no modo de visualização . Para usar esses recursos, você deve definir <LangVersion>
como Preview
em seu projeto:
- Atributos genéricos mais adiante neste artigo.
- membros abstratos estáticos em interfaces.
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:
- Registos
- Init apenas setters
- Declarações de nível superior
- Melhorias na correspondência de padrões: padrões relacionais e padrões lógicos
- Desempenho e interoperabilidade
- Características de ajuste e acabamento
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
, or
e 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 or
queand
:
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 enuint
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()
paraforeach
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#:
- Membros somente leitura
- Métodos de interface padrão
- Melhorias na correspondência de padrões:
- Alternar expressões
- Padrões de propriedade
- Padrões de tupla
- Padrões posicionais
- Utilização de declarações
- Funções locais estáticas
- Estruturas de ref descartáveis
- Tipos de referência anuláveis
- Fluxos assíncronos
- Índices e intervalos
- Atribuição de coalescência nula
- Tipos construídos não gerenciados
- Stackalloc em expressões aninhadas
- Aprimoramento de cordas literais interpoladas
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 umin
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.
- O
- Expressões condicionais
ref
:- O resultado de uma expressão condicional (
?:
) agora pode ser uma referência.
- O resultado de uma expressão condicional (
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:
async
Main
método- O ponto de entrada para um aplicativo pode ter o
async
modificador.
- O ponto de entrada para um aplicativo pode ter o
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:
- Variáveis de saída
- Tuplas e desconstrução
- Correspondência de padrões
- Funções locais
- Membros com corpo de expressão expandida
- Ref moradores locais
- Devoluções Ref
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:
- Importações estáticas
- Filtros de exceção
- Inicializadores de propriedade automática
- Membros com corpo de expressão
- Propagador nulo
- Interpolação de cadeias
- Nome do operador
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:
- Membros assíncronos
- Atributos de informações do chamador
- Projeto de código: Atributos de informações do chamador em C# 5.0
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:
- Vinculação dinâmica
- Argumentos nomeados/opcionais
- Covariante e contravariante genéricas
- Tipos de interoperabilidade incorporados
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:
- Propriedades implementadas automaticamente
- Tipos anónimos
- Expressões de consulta
- Expressões lambda
- Árvores de expressão
- Métodos de extensão
- Variáveis locais digitadas implicitamente
- Métodos parciais
- Inicializadores de objeto e coleçã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:
- Genéricos
- Tipos parciais
- Métodos anónimos
- Tipos de valor anulável
- Iteradores
- Covariância e contravariância
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:
- Classes
- Estruturas
- Interfaces
- Eventos
- Propriedades
- Delegados
- Operadores e expressões
- Instruções
- Atributos
Artigo publicado originalmente no blog NDepend, cortesia de Erik Dietrich e Patrick Smacchia.