Características
C# é uma linguagem de programação orientada a objectos criada pela Microsoft, faz parte da sua plataforma .NET. A empresa baseou C# nas linguagens C++ e Java, e ela é considerada a linguagem símbolo do .NET, por ter sido criada praticamente do zero para funcionar na nova plataforma, sem preocupações de compatibilidade com código existente. O compilador C# foi o primeiro a ser desenvolvido, e a maior parte das classes da plataforma foram desenvolvidas nesta linguagem.
O C# é constituído por diversificadas características. Por exemplo, a linguagem suporta ponteiros através da palavra reservada unsafe
(código não-seguro), que é obrigatório. Seu uso não é aconselhável, e blocos de códigos que o usam geralmente requisitam permissões mais altas de segurança para poderem ser executados. As operações aritméticas são verificadas contra transbordamento de dados. C# também suporta as operações aritméticas básicas como adição, subtracção, multiplicação e divisão. Esses símbolos são chamados operadores, e "operam" os valores das variáveis.
Um coletor de lixo também é suportado, um processo usado para a manutenção de memória. Com este recurso, é possível recuperar a zona de memória que um programa já não utiliza. Quando isto não ocorre pode acontecer a chamada perda de memória, um erro comum que pode levar ao término não desejado do programa em execução por esgotamento da memória livre.
Em C# não existe herança múltipla, ou seja, cada classe só pode herdar apenas uma outra classe e não mais do que uma, no entanto é possível simular herança múltipla utilizando interfaces. Assim, através da herança reduzimos código através da sua reutilização.
Os destrutores são funções que se encarregam de realizar as tarefas que são necessárias executar quando um objecto deixa de existir. Quando este já não está a ser utilizado por nenhuma variável, deixa de ter sentido que esteja armazenado na memória, portanto, o objecto deve ser destruído para liberar espaço. Para isto é chamada a função destrutor. Os destrutores não podem ser definidos em estruturas, são apenas usados em classes, e uma classe pode apenas ter um destrutor, eles não podem ser herdados ou sobrecarregados, nem podem ser chamados pois são invocados automaticamente. Também não pode ser modificado nem de algum modo ter parâmetros.
O C# suporta sobrecarga de métodos e de operadores, mas não suporta argumentos padrão. As únicas conversões implícitas por padrão são conversões seguras tais como, a ampliação de inteiros e conversões de um tipo derivado para um tipo base. Não existem conversões implícitas entre inteiros e variáveis booleanas, enumerações e ponteiros nulos. Qualquer conversão implícita definida pelo utilizador deve ser explicita, apesar do C# ser baseado em variáveis estáticas é possível converter os tipos de dados de uma variável, desde que essa conversão seja possível, pode ser convertido qualquer tipo primitivo para string
, mas nem sempre é possível o contrário. Uma string
que representa um número pode ser convertida para um tipo numérico, um número pode sempre ser convertido para um número com mais bits, exemplo, um tipo byte (8 bits) pode ser convertido para um do tipo int (32 bits). O contrário nem sempre é possível, de um tipo com mais bits para representá-lo para um com menos bits. Desde que o valor não exceda o limite do tipo menor, a conversão ocorrerá sem problemas, senão a execução lança uma exceção. Nas conversões que sempre poderão acontecer, o mesmo é feito automaticamente, sem precisar "forçar" nenhuma dessas conversões. A forma mais simples de efectuar a conversão é usando a classe Convert
, que implementa vários métodos que permite a conversão de qualquer tipo para outro. Todas as conversões de tipo são validadas em função do tipo real da variável em tempo de execução, sem excepções.
Existem diversos mecanismos para criação de novos tipos de dados a partir de tipos já existentes. Um desses mecanismos permite a criação de vectores. Os vectores são todos derivados de uma mesma classe do ambiente .NET, o que significa compartilhar várias operações, métodos e atributos. Os objectos e vectores são necessariamente alocados dinamicamente na memória heap (área de memória reservada) com o uso do operador new
.
Os gabaritos não são suportados, mas a linguagem possui um suporte abrangente a generics. Nela podem se usar tipos genéricos para a maximização da reutilização de código, segurança de tipo, e desempenho. A utilização mais frequente é para a criação de classes. Pode criar as suas próprias interfaces genéricas, métodos, classes, eventos e delegates. As classes genéricas podem ser utilizadas para permitir acesso aos métodos usando tipos de dados específicos. Informações sobre os tipos usados em um tipo de dados genérico podem ser obtidas em tempo de execução por meio de reflexão.