C# é uma linguagem de programação, multiparadigma, de tipagem forte, desenvolvida pela Microsoft como parte da plataforma .NET. A sua sintaxe orientada a objetos foi baseada no C++ mas inclui muitas influências de outras linguagens de programação, como Object Pascal e, principalmente, Java. O código fonte é compilado para Common Intermediate Language (CIL) que é interpretado pela máquina virtual Common Language Runtime (CLR). C# foi inicialmente desenvolvida para o .NET Framework, de código fechado.
Objetivos do projeto A norma ECMA lista os objetivos de design para C#: A linguagem C# destina-se a ser simples, moderna, de propósito geral e orientada a objetos. A linguagem e suas implementações devem fornecer suporte para princípios de engenharia de software, tais como verificação de tipo forte, verificação de limites de array, detecção de tentativas de usar variáveis não inicializadas e coleta automática de lixo. A robustez do software, a durabilidade e a produtividade do programador são importantes. A linguagem destina-se a ser utilizada no desenvolvimento de componentes de software adequados para implantação em ambientes distribuídos. A portabilidade é muito importante para o código fonte e programadores, especialmente aqueles já familiarizados com C e C++. O apoio à internacionalização é muito importante. C# deve ser adequada para escrever aplicações tanto para sistemas hospedados e incorporados, que vão desde o muito grande que usam sistemas operacionais sofisticados, até o muito pequeno com funções dedicadas. Embora aplicações C# se destinam a ser econômicas no que diz respeito à memória e requisitos de energia de processamento, a linguagem não foi concebida para competir diretamente no desempenho e tamanho com C ou linguagem Assembly.
História miniaturadaimagem|Anders Hejlsberg - criador do C#. A linguagem C# faz parte do conjunto de ferramentas oferecidas na plataforma .NET e surge como uma linguagem simples, robusta, orientada a objetos, fortemente tipada e altamente escalável a fim de permitir que uma mesma aplicação possa ser executada em diversos dispositivos de hardware, independentemente destes serem PCs, handhelds ou qualquer outro dispositivo móvel.
O avanço das ferramentas de programação e dos dispositivos eletrônicos inteligentes criou problemas e novas exigências. As novas versões de componentes compartilhados eram incompatíveis com o software antigo. Os desenvolvedores reconheceram a necessidade de software que fosse acessível para qualquer um e disponível por meio de praticamente qualquer tipo de dispositivo. Para tratar dessas necessidades, a Microsoft anunciou sua iniciativa .NET e a linguagem de programação C#."C# - Como Programar", H. M. Deitel, São Paulo: Pearson Education, 2003
Durante o desenvolvimento da plataforma .NET, as bibliotecas foram escritas originalmente numa linguagem chamada Simple Managed C (SMC), que tinha um compilador próprio. Mas, em Janeiro de 1999, uma equipe de desenvolvimento foi formada por Anders Hejlsberg, que fora escolhido pela Microsoft para desenvolver a linguagem. Dá-se início à criação da linguagem chamada Cool. Um pouco mais tarde, em 2000, o projeto .NET era apresentado ao público na Professional Developers Conference (PDC), e a linguagem Cool fora renomeada e apresentada como C#.
A criação da linguagem, embora tenha sido feita por vários programadores, é atribuída principalmente a Anders, hoje um Distinguished Engineer na Microsoft. Ele fora o arquiteto de alguns compiladores da Borland, e entre suas criações mais conhecidas estão o Turbo Pascal e o Delphi.
A Microsoft submeteu o C# à ECMA para uma padronização formal. Em Dezembro de 2001, a associação liberou a especificação ECMA-334 Especificação da Linguagem C#. Em 2003, tornou-se um padrão ISO (ISO/IEC 23270). Há algumas implementações em desenvolvimento, destacando-se a Mono, implementação open source da Novell, o dotGNU e o Portable.NET, implementações da Free Software Foundation, e o BDS 2008, implementação da CodeGear.
Etimologia thumb|80px|A nota dó sustenido em clave de sol. Pensava-se que o nome "C#" viria duma sobreposição de quatro símbolos +, dando a impressão de ++++, uma alusão à continuação do C++. Entretanto, a cerquilha de "C#" se refere ao sinal musical sustenido (♯, ), que aumenta em meio tom uma nota musical.
Porém, devido a limitações técnicas (fontes padrões, navegadores, etc) e o fato do símbolo não estar presente nos teclados, o cerquilha (#) foi escolhido para ser usado no nome escrito. Essa convenção é refletida no ECMA-334 C# Language Specification, a especificação técnica da linguagem. Entretanto, em determinados lugares, como em propagandas e capas de livros, é usado o símbolo de sustenido.
Versões C# 1.0 Alia o poder de C++ com a simplicidade do Visual Basic Código gerenciado com a noção de assemblies carregando o bytecode com segurança embutida e controle de versões Orientação a objeto Tudo deriva de Object Os tipos são Estruturas, Enumerações, Classes, Interfaces, Delegados e Ponteiros (só em contexto unsafe) Tipagem estática Eventos Interoperabilidade com código não gerenciado através de DLL nativa e componentes COM Coletor de lixo de memória baseado em gerações Compilador Just-in-time Facilidades de integração com ferramentas e IDE Sintaxe para documentação Sistema de exceção uniforme Mecanismo de metadados Extensiva biblioteca padrão
C# 2.0 Tipos e métodos genéricos Tipos Parciais Métodos anônimos Iteradores Tipos anuláveis Acessibilidade separada para Getter/setter Conversões de grupo de métodos para delegados Co e Contravariância para delegados Classes estáticas Inferência de delegado Interface web
C# 3.0 Variáveis locais implicitamente tipadas Inicializadores de objetos e coleções Propriedades auto-implementadas Tipos anônimos Métodos de extensão Expressões de consulta Expressões Lambda Árvores de expressão Métodos parciais
C# 4.0 Vinculação dinâmica Argumentos nomeados e opcionais Co e contravariância genérica Tipos embutidos de interoperabilidade ("NoPIA")
C# 5.0 Métodos assíncronos Atributos de informação do chamador
C# 6.0 Compilador como serviço (Roslyn) Importação de membros de tipos estáticos no espaço de nomes Filtros de exceção Await em blocos catch/finally Inicializadores de propriedades automáticas Valores padrões para propriedades apenas getter Membros com corpos como expressão Propagador de Null (operador condicional de null, checagem de null sucinta) Interpolação de string Operador nameof Inicializador de dicionário
C# 7.0 Características em processo de desenvolvimento Literais binários Separadores de dígitos Funções locais Switch para tipos Retorno de referências Tuplas Declaração Out (Out var ou Out "tipo") Pattern Matching Returno de async arbitrário
C# 7.1 async Método Main default Expressões literais Nomes de elementos de tupla inferidos
C# 7.2 Técnicas para escrever código eficiente seguro Argumentos nomeados que não estejam à direita Sublinhados à esquerda em literais numéricos Modificador de acesso private protected Expressões ref condicionais
C# 7.3 C# 8.0 C# 9.0 Registros (Record) C# 10.0 Diretivas Using Globais e Implícitas Declaração de Namespace com escopo de arquivo Melhorias dos tipos de estrutura Manipulador de strings interpolado
Características O C# é uma linguagem de programação visual dirigida por eventos e totalmente orientada a objetos. Permite um novo grau de intercâmbio entre linguagens (componentes de software de diferentes linguagens podem interagir). Os desenvolvedores podem empacotar até software antigo, para trabalhar com novos programas C#. Além disso, os aplicativos C# podem interagir pela Internet usando padrões do setor, como SOAP (protocolo de acesso a objetos simples) e XML (linguagem de marcação extensível).
O C# tem raízes em C, C++ e Java, adaptando os melhores recursos de cada linguagem e acrescentando novas capacidades próprias. Ele fornece os recursos que são mais importantes para os programadores, como programação orientada a objetos, strings, elementos gráficos, componentes de interface com o usuário gráfica (GUI), tratamento de exceções, múltiplas linhas de execução, multimídia (áudio, imagens, animação e vídeo), processamento de arquivos, estruturas de dados pré-empacotadas, processamento de banco de dados, redes cliente/servidor com base na Internet e na World Wide Web e computação distribuída.
Principais características do C# Dentre as características essenciais do C# podemos citar:
Simplicidade: os projetistas de C# costumam dizer que essa linguagem é tão poderosa quanto o C++ e tão simples quanto o Visual Basic; Completamente orientada a objetos: em C#, qualquer variável tem de fazer parte de uma classe; Fortemente tipada: isso ajudará a evitar erros por manipulação imprópria de tipos e atribuições incorretas; Gera código gerenciado: assim como o ambiente .NET é gerenciado, assim também é o C#; Tudo é um objeto: System.Object é a classe base de todo o sistema de tipos de C#; Controle de versões: cada assembly gerado, seja como EXE ou DLL, tem informação sobre a versão do código, permitindo a coexistência de dois assemblies homônimos, mas de versões diferentes no mesmo ambiente; Suporte a código legado: o C# pode interagir com código legado de objetos COM e DLLs escritas em uma linguagem não gerenciada; Flexibilidade: se o desenvolvedor precisar usar ponteiros, o C# permite, mas ao custo de desenvolver código não gerenciado, chamado “unsafe”; Linguagem gerenciada: os programas desenvolvidos em C# executam num ambiente gerenciado, o que significa que todo o gerenciamento de memória é feito pelo runtime via o GC (Garbage Collector)."C# e .NET - Guia do Desenvolvedor", Edwin Lima, Eugênio Reis, Rio de Janeiro: Campus, 2002
Sintaxe A sintaxe da linguagem C# é semelhante à de outras linguagens de estilo C, como C, C ++ e Java. Em particular: Os pontos e vírgulas são usados para denotar o fim de uma declaração. As chaves são usadas para agrupar declarações. As declarações são geralmente agrupadas em métodos (funções), métodos em classes, e classes em namespaces. As variáveis são atribuídas usando um sinal de igual, mas comparadas usando dois sinais iguais consecutivos. Colchetes são usados com arrays, tanto para declará-los e para obter um valor em um determinado índice em um deles. Possui uma forma limitada de diretivas de compilação. Essencialmente imperativa, como todas linguagens mainstream.
Orientação a objeto Um dos principais recursos da programação orientada a objetos é a herança. Herança é uma forma de reutilização de software em que as classes são criadas pela absorção dos dados e comportamentos de uma classe já existente e aprimorando-as com novos recursos. Ao criar uma classe, em vez de escrever variáveis de instância e métodos complementares novos, o programador pode indicar que a nova classe deve herdar as variáveis de classe, propriedades e métodos de outra classe. Uma classe derivada é mais específica do que sua classe base e representa um grupo mais especializado de objetos. Normalmente, a classe derivada contém os comportamentos de sua classe base e comportamentos adicionais. No caso de herança simples, uma classe é derivada de uma única classe base. Ao contrário do C++, o C# não suporta herança múltipla (que ocorre quando uma classe é derivada de mais de uma classe base direta).Object-oriented Programming in C# for C and Java programmers. Kurt Nørmark, 2011. http://people.cs.aau.dk/~normark/oop-csharp/html/notes/theme-index.html