quarta-feira, 21 de abril de 2010
C#
C# (ou C Sharp) é uma linguagem de programação orientada a objetos 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 Delphi e Java.
História
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 inicio à 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.
Etimologia
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, o # de C# se refere ao sinal musical (sustenido), que aumenta em meio tom uma nota musical. O símbolo real seria o ♯ e não o #. Porém, devido a limitação de telas, fontes e alguns navegadores, no momento da normalização junto a ECMA, fora especificado apenas que o nome da linguagem seria uma letra C maiúscula (U+0043) e o sinal # (U+0023), facilitando assim, publicações e artigos com um caracter encontrado facilmente dos layouts de teclado padrões. Desta forma, caso o nome fosse usado em português, seria "C-Sustenido" (ou "Dó-Sustenido"), e não "C-cerquilha".
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. Ver exemplo contextualizado em anexo.
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. Ver exemplo contextualizado em anexo.
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. Ver exemplo contextualizado em anexo.
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. Ver exemplo contextualizado em anexo.
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.
Passagem de parâmetros
Há três tipos de passagem de parâmetros em C#, por valor, por referência e por saída. Na passagem por valor é feita uma cópia do argumento da chamada do método para o parâmetro do mesmo. Isso significa que as alterações que ocorrem nas variáveis passadas por cópia dentro do método não se refletem fora dele. Na passagem por referência toda alteração feita na variável passada por referência dentro do método alterará também seu valor fora dele.
Por padrão todo objeto e vetor são passados por referência e toda estrutura e variáveis primitivas são passadas por valor. Para se forçar a passagem por referência, tanto a chamada do método como a declaração dele devem estar com os argumentos e parâmetros precedidos pelas palavras reservadas ou ref ou out. A primeira é usada para se manipular um parâmetro já inicializado antes da chamada do método, de forma a somente editá-lo. A segunda é usada para se inicializar um parâmetro durante a execução do método, retornando o resultado para o método que o chamou. Ver exemplo contextualizado em anexo.
Polimorfismo
O que é o polimorfismo? Esta palavra veio do latim e significa varias formas. Podemos considerar como sendo a capacidade de um operador desempenhar uma tarefa de acordo com o tipo do operando. Polimorfismo está associado à idéia de que entidades do programa possam ter mais de uma forma ou implementação.
O Polimorfismo é dividido em vários tipos conforme a definição de polimorfismo de Cardelli e Wegner (http://lucacardelli.name/Papers/OnUnderstanding.A4.pdf):
Polimorfismo Universal Paramétrico:
Considerado o polimorfismo verdadeiro, um mesmo objeto pode ser utilizado como parâmetro em diferentes contextos sem necessidade de alterações. Uma função que exibe polimorfismo paramétrico (também chamada de função genérica) permite que o tipo do seu argumento seja determinado por um parâmetro implícito ou explícito, executando uma mesma operação, independente do tipo de argumento. Em C#, é suportado através do uso de Generics (Framework 2.0 +), namespace System.Collections.Generic.
Ex.:
// Criando uma lista de Objetos:
List
Assinar:
Postar comentários (Atom)
Nenhum comentário:
Postar um comentário