C Sharp

## Introdução

A linguagem de programação C# é uma ferramenta essencialmente imperativa, que utliza o paradigma orientado a objetos, criada pela empresa Microsoft, que foi lançada conjuntamente à plataforma .NET(dotNet), e possui como plataforma principal o sistema operacional Microsoft Windows. O projeto da linguagem foi criado do zero, porém possui fortes influências das estruturas operacionais das linguagens C++, Pascal e principalmente Java.

Atualmente, a sua implementação é de código fechado, por ser uma política comum na empresa que a criou. O C# é amplamente utilizado em projetos que necessitam escalabilidade, manutenibilidade e desempenho, sendo investidos milhões de dólares no desenvolvimento e evolução da linguagem.

## Exemplo de "Olá mundo!"

```
public class ClasseExemplo2:
{
public static void Main()
 {
 System.Console.WriteLine("Olá mundo!")
 }
}

```

## História da linguagem

A linguagem C# foi criada junto com a arquitetura .NET. Tendo seu desenvolvimento iniciado em meados de 1999, onde, a convite da Microsoft, Anders Hejlsberg montou uma equipe para desenvolver uma nova linguagem de programação. A princípio, essa nova linguagem tinha recebido o nome de *Cool.* Embora existam várias outras linguagens que suportam essa tecnologia (como VB.NET, C++, J#), C# é considerada a linguagem símbolo do .NET pelas seguintes razões:

* Foi criada praticamente do zero para funcionar na nova plataforma, sem preocupações de compatibilidade com código de legado.

* O compilador C# foi o primeiro a ser desenvolvido.

* A maior parte das classes do .NET Framework foram desenvolvidas em C#.

* A criação da linguagem, embora tenha sido feita por vários desenvolvedores, é atribuída principalmente a Anders Hejlsberg, hoje um Distinguished Engineer na Microsoft. Anders Hejlsberg era desenvolvedor de compiladores na Borland, e entre suas criações mais conhecidas estão o Turbo Pascal e o Delphi.

## Comparações com outras linguagens

Quando comparada com C e C++, a linguagem é restrita e melhorada de várias formas incluindo:
Ponteiros e aritmética sem checagem só podem ser utilizados em uma modalidade especial chamada modo inseguro (unsafe mode). Normalmente os acessos a objetos são realizados através de referências seguras, as quais não podem ser invalidadas e normalmente as operações aritméticas são checadas contra sobrecarga (overflow).
Objetos não são liberados explicitamente, mas através de um processo de coleta de lixo (garbage collector) quando não há referências aos mesmos, previnindo assim referências inválidas. Destrutores não existem. O equivalente mais próximo é a interface Disposable, que juntamente com a construção using block permitem que recursos alocados por um objeto sejam liberados prontamente. Também existem finalizadores, mas como em Java sua execução não é imediata. Como no Java, não é permitida herança múltipla, mas uma classe pode implementar várias interfaces abstratas. O objetivo principal é simplificar a implementação do ambiente de execução.

Apesar de C# ser freqüentemente tido como similar a Java, existem uma série de diferenças importantes, mas a maioria é implementada de forma diferenciada em ambas as linguagens.

Por exemplo, o Java não implemente propriedades, mas permite a utilização de métodos Get e Set que realizam o mesmo processo.

Outros detalhes são:

\* O Java não implementa o goto como estrutura de controle, mas o C# sim, apesar de ser pouco usual. O Java utiliza comentários Javadoc e o C# utiliza comentários baseados em XML. O C# possui indexadores. O Java tem Listeners. O Java utiliza a JVM, o C# o .Net Framework, Mono e DotGnu. Um dos principais editores do Java é o Eclipse, o do C# é o Visual Studio. Mas ambos tem compiladores de linha de comando. O Java pode ser compilado em qualquer plataforma, o C# possui compiladores para Windows, Windows Mobile, Linux, Mac OS X e Solaris. A plataforma .Net da Microsoft provê compiladores para Windows e Windows Mobile (.Net Compact Framework), já a plataforma Mono provê compiladores para Windows, Linux, Mac OS X e Solaris.
No final, ambos possuem recursos similares, sendo possível o programador escolher a linguagem com a qual mais simpatiza.

## Histórico de versões

### C# versão 1.0

Ao olhar para o passado, a C# versão 1.0 parecia muito com o Java. Como parte de suas metas de design declaradas para ECMA, ela buscava ser uma "linguagem simples, moderna, de uso geral e orientada a objeto". No momento, parece que o Java alcançou essas metas de design iniciais.

Mas agora, se examinar novamente a C# 1.0, você poderá se sentir um pouco confuso. Carecia das funcionalidades assíncronas internas e algumas das funcionalidades relacionadas a genéricos que você nem valoriza. Na verdade, ela não tinha nada relacionado a genéricos. E a LINQ? Ainda não estava disponível. Essas adições levariam alguns anos para sair.

A versão 1.0 do C# parecia ter poucos recursos, em comparação com os dias de hoje. Você teria que escrever código um tanto detalhado. Mas, ainda assim, você poderia iniciar em algum lugar. A versão 1.0 do C# era uma alternativa viável ao Java na plataforma Windows.

Os principais recursos do C# 1.0 incluíam:

* Classes
* Estruturas
* Interfaces
* Eventos
* Propriedades
* Delegados
* Expressões
* Instruções
* Atributos
* Literais

### C# versão 1.2

C# versão 1.2 fornecido com o Visual Studio 2003. Ele continha algumas pequenas melhorias na linguagem. Muito notável é que, a partir desta versão, o código gerado em um loop `foreach` chamou Dispose, em um IEnumerator, quando o IEnumerator implementou IDisposable.

### C# versão 2.0

Neste momento, as coisas começam a ficar interessantes. Vamos dar uma olhada em alguns recursos principais do C# 2.0, lançado em 2005, junto com o Visual Studio 2005:

* Genéricos
* Tipos parciais
* Métodos anônimos
* Tipos que permitem valor nulo
* Iteradores
* Covariância e contravariância

Outros recursos do C# 2.0 adicionaram funcionalidades a recursos existentes:

* Acessibilidade separada getter/setter
* Conversões de grupo de método (delegados)
* Classes estáticas
* Inferência de delegado

Embora C# possa ter começado como uma linguagem OO (orientada a objeto) genérica, a versão 2.0 do C# tratou de mudar isso rapidamente. Depois de se acostumarem com a ideia da linguagem OO, os desenvolvedores começaram a sofrer com vários pontos problemáticos graves. E os procuraram de maneira significativa. Com genéricos, tipos e métodos podem operar em um tipo arbitrário enquanto ainda mantêm a segurança de tipos. Por exemplo, ter um List<T> permite que você tenha `List<string>` ou `List<int>` e execute operações fortemente tipadas nessas cadeias de caracteres ou inteiros enquanto itera neles. Usar genéricos é melhor que criar `ListInt` que deriva de `ArrayList` ou converter de `Object` para cada operação. A versão 2.0 do C# trouxe iteradores. Em resumo, o iteradores permitem que você examine todos os itens em um `List` (ou outros tipos Enumeráveis) com um loop `foreach`. Ter iteradores como uma parte importante da linguagem aprimorou drasticamente a legibilidade da linguagem e a capacidade das pessoas de raciocinar a respeito do código. E ainda assim, o C# continuava na tentativa de alcançar o mesmo nível do Java. O Java já tinha liberado versões que incluíam genéricos e iteradores. Mas isso seria alterado logo, pois as linguagens continuaram a evoluir separadamente.

### C# versão 3.0

O C# versão 3.0 chegou no final de 2007, juntamente com o Visual Studio 2008, porém o pacote completo de recursos de linguagem veio, na verdade, com o C# versão 3.5. Esta versão foi o marco de uma alteração significativa no crescimento do C#. Ela estabeleceu o C# como uma linguagem de programação realmente formidável. Vamos dar uma olhada em alguns recursos importantes nesta versão:

* Propriedades autoimplementadas
* Tipos anônimos
* Expressões de consulta
* Expressão lambda
* Árvores de expressão
* Métodos de extensão
* Variáveis locais implicitamente tipadas
* Métodos parciais
* Inicializadores de objeto e de coleção

Numa retrospectiva, muitos desses recursos parecerem inevitáveis e inseparáveis. Todos eles se encaixam estrategicamente. Costuma-se pensar que o recurso irresistível dessa versão do C# foi a expressão de consulta, também conhecida como LINQ (consulta integrada à linguagem).

Uma exibição mais detalhada analisa árvores de expressão, expressões lambda e tipos anônimos como a base na qual o LINQ é construído. Mas, de uma forma ou de outra, o C# 3.0 apresentou um conceito revolucionário. O C# 3.0 começou a definir as bases para transformar o C# em uma linguagem híbrida orientada a objeto e 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 loop `for` para calcular a média de uma lista de inteiros, agora você pode fazer isso simplesmente como `list.Average()`. A combinação de expressões de consulta e métodos de extensão fez parecer que essa lista de inteiros se tornasse muito mais inteligente.

Levou algum tempo para que as pessoas entendessem e integrassem o conceito, mas isso aconteceu gradualmente. E agora, anos mais tarde, o código é muito mais conciso, simples e funcional.

### C# versão 4.0

O C# versão 4.0 enfrentou dificuldades para sobreviver ao status inovador da versão 3.0. Com a versão 3.0, o C# tirou verdadeiramente a linguagem da sombra do Java e a colocou em proeminência. A linguagem foi rapidamente se tornando elegante.

A próxima versão introduziu alguns novos recursos interessantes:

* Associação dinâmica
* Argumentos opcionais/nomeados
* Genérico covariante e contravariante
* Tipos de interoperabilidade inseridos

Os tipos de interoperabilidade inseridos atenuaram um problema de implantação. A contravariância e a covariância genérica oferecem maior capacidade para usar genéricos, mas eles são um tanto acadêmicos e provavelmente mais apreciados por autores de estruturas e bibliotecas. Os parâmetros nomeados e opcionais permitem eliminar várias sobrecargas de método e oferecem conveniência. Mas nenhum desses recursos é exatamente uma alteração de paradigma.

O recurso principal foi a introdução da palavra-chave `dynamic`. A palavra-chave `dynamic` introduziu na versão 4.0 do C# a capacidade de substituir o compilador na tipagem em tempo de compilação. Com o uso da palavra-chave dinâmica, você pode criar constructos semelhantes a linguagens dinamicamente tipadas, como JavaScript. Você pode criar um `dynamic x = "a string"` e, em seguida, adicionar seis a ela, deixando que o tempo de execução decida o que acontece em seguida.

Associação dinâmica tem potencial de erros, mas também grande eficiência na linguagem.

### C# versão 5.0

O C# versão 5.0 era uma versão focada da linguagem. Quase todo o esforço para essa versão foi dedicado a outro conceito inovador de linguagem: os modelos `async` e `await` para programação assíncrona. Aqui está a lista dos recursos principais:

* Membros assíncronos
* Atributos de informações do chamador
* Code Project: Caller Info Attributes in C# 5.0 (Code Project: Atributos de informações do chamador em C# 5.0)

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

Mas `async` e `await` são as verdadeiras estrelas dessa versão. Quando esses recursos foram lançados em 2012, o C# virou o jogo novamente, implantando a assincronia na linguagem como uma participante da maior importância. Se você já teve que lidar com operações de longa execução e a implementação de redes de retorno de chamada, você provavelmente adorou esse recurso de linguagem.

### C# versão 6.0

Nas versões 3.0 e 5.0, o C# recebeu alguns novos recursos importantes em uma linguagem orientada a objeto. Na versão 6.0, ele abre mão de um recurso arrasador dominante liberando, em vez disso, muitos recursos menores que tornam a programação em C# mais produtiva. Aqui estão alguns deles:

* Importações estáticas
* Filtros de exceção
* Inicializadores de propriedade
* Membros aptos para expressão
* Propagador nulo
* Interpolação de cadeia de caracteres
* Operador nameof
* Inicializadores de índice

Outros novos recursos incluem:

* Await em blocos catch/finally
* Valores padrão para propriedades somente getter

Cada um desses recursos é interessante em seus próprios méritos. Mas, se você os observar em conjunto, verá um padrão interessante. Nesta versão, o C# eliminou o clichê de linguagem para tornar o código mais conciso e legível. Portanto, para os fãs de código simples e conciso, essa versão da linguagem foi um grande benefício.

Fizeram ainda outra coisa com esta versão, embora não seja um recurso de linguagem tradicional em si.Lançaram Roslyn, o compilador como um serviço. Agora o compilador de C# é escrito em C#, e você pode usar o compilador como parte de seus esforços de programação.

### C# versão 7.0

A versão principal mais recente do C# é a versão 7.0. Esta versão tem algumas coisas interessantes e evolutivas na mesma direção que o C# 6.0, mas sem o compilador como um serviço. Aqui estão alguns dos novos recursos:

* Variáveis Out
* Tuplas e desconstrução
* Correspondência de padrões
* Funções locais
* Membros aptos para expressão expandidos
* Locais e retornos de ref

Outros recursos incluíam:

* Descarta
* Literais binários
* Separadores de dígito
* Locais e retornos de ref
* Expressões throw

Todas essas funcionalidades oferecem novos recursos interessantes para desenvolvedores e a oportunidade de escrever um código mais limpo do que nunca. Um ponto alto é a condensação da declaração de variáveis a serem usadas com a palavra-chave `out` e a permissão de vários valores retornados por meio de tupla.

Mas o C# está sendo colocado para um uso cada vez mais amplo. Agora o .NET Core tem qualquer sistema operacional como destino e tem a visão firme na nuvem e na portabilidade. Essas novas funcionalidades certamente ocupam a mente e o tempo dos designers da linguagem, além de levarem a novos recursos.

## Referências

1. História e características da linguage C#. Consultado em 10 de outubro de 2018.
2. A evolução da linguagem de programação C#. Consultado em 10 de outubro de 2018.
3. O histórico da linguagem C#. Consultado em 10 de outubro de 2018.