You are on page 1of 31

Estudo dos paradigmas de programao em C#

10 Outubro/2012

SUMRIO

1- Tipos

p.5

2- Checagem e Equivalencia de Tipos p.7 3-Expresses 4 Abstrao de Funes 5 Estrategias de Avaliao 6 Tipos de Variveis 7 Tempo de Vida 8 Gerenciamento de Memria 9 Persistencia de Dados 10 Comando, Efeitos colaterais 11 Correspondencia e Parametros 12 Polimorfismo 13 Concorrencia 14 Bibliografia p.11 p.14 p.17 p.19 p.19 p.20 p.22 p.23 p.25 p.27 p.28 p.31

INTRODUO

Neste trabalho, ser abordada as caractersticas da linguagem C# e seus paradigmas de programao.

1 - Tipos
C# uma linguagem fortemente tipada. Cada varivel e constante tem um tipo, como cada expresso que avalia um valor. Cada assinatura do mtodo Especifica um tipo para cada parmetro de entrada e para o valor de retorno.

Tipos Valor Tipos valor no podem ser usados como classes base para criar novos tipos por que estes so implementados. Usando classes chamadas seladas, a partir das quais no possvel implementar o mecanismo de herana. Antes de serem usados, os tipos valor devem ser inicializados, caso contrrio o compilador acusar um erro. Os tipos valor so subdivididos em duas categorias: 1. Estruturas. Usadas para implementar tipos simples chamados de primitivos em outras linguagens de programao 2. Enumerados. Usados para implementar listas de valores constantes, os quais podem ser de qualquer tipo inteiro (long, int, etc.); porm no podem ser do tipo char.

Tipos Primitivos Numricos: inteiros, ponto flutuante e decimal Booleanos: verdadeiro e falso Tipos definidos pelo usurio: estruturas propriamente ditas que permitem que o usurio crie seus prprios tipos. Tipos Referncia

Os seguintes tipos referncia fazem parte do namespace System e derivam diretamente do System.Object: class, object, string, delegate, interface

Strings O tipo string representa uma seqncia de caracteres Unicode. string um alias para string a = "hello"; string b = "h"; O operador + concatena strings: string a = "Bom " + "dia"; O [] operador acessa caracteres individuais de uma string: char x = "teste"[2]; // x = 's'; O arroba (@) evita que seqncia de escape sejam processadas: @"c:\Docs\Source\a.txt" // o mesmo que "c:\\Docs\\Source\\a.txt"

2 - Checagem e Equivalncia de Tipos

Como o C# estaticamente tipado no momento de compilar, aps uma varivel ser declarada, ela no pode ser declarada novamente ou usada para armazenar valores de outro tipo a menos que esse tipo seja conversvel para o tipo da varivel. Por exemplo, no h nenhuma converso de um nmero inteiro para qualquer seqncia de caracteres

arbitrria. Portanto, aps voc declarar i como um nmero inteiro, voc no pode atribuir a ele a string "Hello", conforme mostrado no cdigo a seguir.

int i; i = "Hello"; // Error: "Cannot implicitly convert type 'string' to 'int'"

No entanto, s vezes, talvez seja necessrio copiar um valor para um parmetro de mtodo ou varivel de outro tipo. Por exemplo, voc pode ter uma varivel integer que voc precisa passar para um mtodo cujo parmetro digitado como double. Ou talvez voc precise atribuir uma varivel de classe a uma varivel de um tipo de interface. Esses tipos de operaes so chamadas de converses de tipo. Na C#, voc pode realizar os seguintes tipos de converses:

Converses implcitas: Nenhuma sintaxe especial necessria porque a converso de tipo seguro e sem perda de dados. Exemplos incluem converses de tipos menores para maiores e converses de classes derivadas para classes base.

Converses explcitas (casts): Converses explcitas exigem um operador de converso. A converso necessria quando as informaes podem ser perdidas na converso, ou quando a converso talvez no seja bem-sucedida por outros motivos. Exemplos tpicos incluem converso numrica para um tipo que possui a menor preciso ou um intervalo menor e converso de uma instncia da classe base para uma classe derivada.

Converses definidas pelo usurio: Converses definidas pelo usurio so realizadas por mtodos especiais que voc pode definir para permitir converses explcitas e implcitas entre tipos customizados que no tm uma relao de derivao com a classe base.

Converses com classes auxiliares: para converter entre tipos de no-compatveis, como, por exemplo, inteiros e System.DateTime objetos, ou seqncias de caracteres hexadecimais e matrizes de bytes, voc pode usar o System.BitConverter classe, o System.Convert classe e o Parse tipos de mtodos para o valor numrico que internos, como Int32.Parse.

Converses implcitas

Para tipos numricos internos (ou primitivos), uma converso implcita pode ser feita quando o valor a ser armazenado puder caber na varavel, sem ser truncado ou arredondado. Por exemplo, uma varivel do tipo longo (inteiro de 8 bytes) pode armazenar qualquer valor que uma int (4 bytes em um computador de 32 bits) pode armazenar. No exemplo a seguir, o compilador converte implicitamente o valor direita para um tipo de long antes de atribu-lo para bigNum.

int num = 2147483647; long bigNum = num;

Tipos de referncia, uma converso implcita sempre existe de uma classe para qualquer uma das suas interfaces ou classes base diretas ou indiretas. Nenhuma sintaxe especial necessria porque uma classe derivada sempre contm todos os membros de uma classe base.

Derived d = new Derived(); Base b = d;

Converses explcitas

No entanto, se uma converso no pode ser feita sem um risco de perda de informaes, o compilador requer que voc executa uma converso explcita, o que chamada de um cast. A projeo uma maneira de informar explicitamente o compilador que voc pretende fazer a converso e que voc est ciente de que pode ocorrer perda de dados. Para executar uma converso, especifique o tipo que so a projeo para entre parnteses na frente do valor ou varivel a ser convertido. O seguinte programa projees de um double para um int. O programa no ser compilado sem a projeo.

class Test { static void Main() { double x = 1234.7; 9

int a; a = (int)x; System.Console.WriteLine(a); } }

Para tipos de referncia, uma converso explcita necessria se voc precisar converter de um tipo base para um tipo derivado:

Giraffe g = new Giraffe(); Animal a = g; Giraffe g2 = (Giraffe) a;

Uma operao de converso entre tipos de referncia no altera o tipo de tempo de execuo do objeto subjacente; ele apenas altera o tipo do valor que est sendo usado como uma referncia a esse objeto.

10

3 - Expresses

Operadores - Operadores aritmticos + (Adio), - (Subtrao), * (Multiplicao), / (Diviso) ,% (Resto/Mdulo) - Operadores de atribuio = (Atribuio simples), += (Atribuio aditiva) Atribuio Multiplicativa), /= (Atribuio de diviso), %= (Atribuio de mdulo) - Operadores relacionais == (Igualdade), > (Maior), < (Menor), <= (Menor igual), >= (Maior igual), != (Diferente) - Operadores lgicos && (E), || (OU),

Instrues de Controle Uma instruo de controle usada para controlar o fluxo de execuo do programa baseando-se em uma condio verdadeira ou falsa. Exemplos:IF : if (flagCheck == true), Seleo baseada em um expresso booleana. CaseSwitch : int caseSwitch = 1; Seleo que trata multiplas enumeraes. Case 1: Case 2:

11

Instrues de Iterao As instrues de iterao permitem repetir um determino trecho do algoritmo de acordo com uma condio. Instruo For: Executa uma instruo ou um bloco de instrues repetidamente at que uma expresso especificada avaliada como falsa. for (int i = 1; i <= 5; i++) { loop a ser executado }

Instruo While. Executa uma instruo ou um Bloquear de instrues at que uma expresso especificada avaliada como falsa

while (n < 5){ loop a ser executado }

Instruo for each. Esta instruo fornece uma maneira simples e limpa para iterar Atravs os elementos de uma matriz.

class ForEachTest{ static void Main(string[] args){ Int[] fibarray = new int[] { 0, 1, 2, 3, 5, 8, 13 }; foreach (int i in fibarray) { System.Console.WriteLine(i); } } }

12

Instruo Continue. O comando continue tambm usado em laos(while, for, etc.) quando em execuo o comando continue ir mover a instruo para a prxima iterao sem executar as linhas aps o continue

for (int i = 1; i <= 10; i++) { if (i < 9) continue; Console.WriteLine(i); }

4 - Escopo e Declaraes

Escopo O escopo de um elemento declarado o conjunto de todo o cdigo que pode referir-se a ele sem qualificar seu nome ou tornando-o disponvel por um Importa instruo (.NET espao para nome e tipo). Voc especifica o escopo de um elemento ao declar-lo. O escopo pode depender os seguintes fatores: - A regio (bloco, procedimento, mdulo, de classe ou estrutura) na qual voc declara o elemento - O namespace que contm a declarao do elemento - O nvel de acesso que voc declara para o elemento

13

Nveis de Escopo Um elemento de programao est disponvel em toda a regio em que voc o declara. Todo o cdigo na mesma regio pode referir-se ao elemento sem qualificar seu nome.

- Escopo de Bloco Um bloco um conjunto de instrues envolto em instrues de declarao de nicio e trmino, Se voc declarar uma varivel em um bloco, voc poder us-la apenas dentro desse bloco como o seguinte: Do e Loop For [Each] e Next. If e End If Select e End Select SyncLock e End SyncLock Try e End Try While e End While With e End With - Escopo de Procedimento Um elemento declarado dentro de um procedimento no est disponvel fora desse procedimento. Somente o procedimento que contm a declarao pode us-lo. Variveis nesse nvel so conhecidas como variveis locais. Escopos de procedimento e bloco esto intimamente relacionadas. Se voc declarar uma varivel dentro de um procedimento, mas fora de qualquer bloco

14

dentro desse procedimento, voc pode pensar a varivel como se tivesse escopo de bloco, onde o bloco todo o procedimento.

- Escopo de Mdulo Por conveniencia, o nvel de mdulo aplica-se igualmente a mdulos, classes e estruturas. Voc pode declarar elementos nesse nvel, colocando a instruo de declarao fora de qualquer procedimento ou bloco mas dentro do mdulo, classe ou estrutura. Quando voc faz uma declarao no nvel do mdulo, o nvel de acesso escolhido determina o escopo. Os elementos para os quais voc declarar o nvel de acessoPrivate (Visual Basic) esto disponveis para cada procedimento desse mdulo, mas no para qualquer cdigo em um mdulo diferente. Caso no seja usada nenhuma palavra-chave, a instruo por padro private.

Declarao de Classes e Estruturas

Classes e estruturas so duas construes bsicas do sistema de tipo comum no .NET Framework. uma estrutura de dados que encapsula mtodos, propriedades e eventos e assim por diante. Uma declarao de classe ou estrutura como um desenho que usado para criar instncias ou objetos em tempo de execuo. Se voc definir uma classe ou estrutura chamada Person, Person o nome do tipo. Se voc declara e inicializa uma varivel p tipo Person, p considerado um objeto ou instncia de Person. Mltiplas

15

instncia do mesmo tipo Person podem ser criadas, e cada instncia pode ter valores diferentes na suas propriedades e campos. Uma classe um tipo de referncia. Quando um objeto da classe criado, a varivel qual o objeto est atribudo contm apenas uma referncia para a memria. Quando a referncia de objeto atribuda a uma nova varivel, a novo varivel se refere ao objeto original. As alteraes feitas atravs de uma varivel so refletidas na outra varivel pois ambos se referem aos mesmos dados. Uma struct um tipo de valor. Quando uma struct criada, a varivel aos quais a struct atribuda contm dados reais da struct. Quando a struct atribuda a uma nova varivel, ela copiada. A nova varivel e a varivel original, portanto, contm duas cpias separadas dos mesmos dados. Alteraes feitas em uma no afetam a outra. Em geral, as classes so usadas para modelar o comportamento mais complexo ou dados que se destinam a ser modificados depois que um objeto de classe criado. As estruturas so mais apropriadas para estruturas de dados pequeno que contm principalmente os dados que no se destina a serem modificados depois que a estrutura criada.

16

5 - Abstrao de funes
Abstrao um conceito fundamental para se atingir uma boa modularizao. Abstrao o processo no qual se seleciona, do contexto do problema a resolver, o que importante de ser representado para resolver o problema. A abstrao possibilita o trabalho em nveis no desenvolvimento de programas. (Varejo). Em C#, as funes so definidas da seguinte maneira: Exemplo em C#: Private int return a*b;

Multiplica(int

a,

int

b){

Comparao em pascal function Multiplica (a:Integer; b:Integer): Integer; begin potencia:= a*b; end. Funes de Alta Ordem

Funes de alta ordem so aquelas que permitem a utilizao de funes como argumentos, ou que enviam funes como sada. LINQ (Consulta Integrada Linguagem) um conjunto de recursos introduzidos no Visual Studio 2008 que amplia os recursos de consulta poderosa para a sintaxe da linguagem de C#. Exemplo em C#: var squares = numbers.Select( num => num*num ); Este exemplo mapeia cada nmero ao seu quadrado

17

6 - Estratgias de Avaliao
Na avaliao vida ou estrita (eager evaluation), os argumentos sempre so avaliados completamente antes da funo ser aplicada. if ((sName==null) | (sName="~empty~")) //faa algo Caso sName seja null, este cdigo resultar em erro j que a segunda comparao ser executada. A avaliao preguiosa ou no estrita (lazy evaluation), uma estratgia na qual uma expresso ser avaliada apenas quando o seu valor for necessitado. Este tipo de avaliao evita clculos desnecessrios, e pode melhorar o tempo de execuo do programa. Exemplo: if ((sName==null) || (sName="~empty~")) //faa algo Este caso no resultar em erro, j que caso o primeiro seja verdadeiro, o segundo termo no ser avaliado.

7 - Tipos de Variveis

Arrays Em C# existem trs tipos de array: Single-Dimensional, Multidimensional e Jagged. O single-dimensional possui uma dimenso, o multidimensional, duas ou mais

18

dimenses, e o jagged um array de arrays, podendo conter arrays de diferentes dimenses dentro dele. Exemplos: Single-Dimensional: int[] array1 = new int[5]; Multi-Dimensional: int[,] multiDimensionalArray1 = new int[2, 3]; Jagged: int[][] jaggedArray = new int[3][]; jaggedArray[0] = new int[5]; jaggedArray[1] = new int[4]; jaggedArray[2] = new int[2]; Tambm podemos utilizar arrays dinmicos em C#, isto , arrays com tamanhos flexveis. Exemplo: ArrayList myAL = new ArrayList(); myAL.Add("Hello"); myAL.Add("World");

8 - Tempo de Vida das Variveis

Um objeto em C# permanece na memria at que o coletor de lixo o remova. Isto acontece algum tempo depois de que todas as referncias ao objeto so excludas. Em C#, podemos forar que algum objeto seja coletado utilizando o trecho GC.Collect(). Com o uso do mtodo Dispose() da interface IDisposable, podemos explicitamente liberar os recursos no gerenciados em conjunto com o Garbage Collector. Exemplo:

19

using System; using System.IO; //Implementao da interface IDisposable public class MyReader : IDisposable { //Um StreamReader, que apesar de trabalhar com //recursos nao gerenciados, um objeto do //.Net framework e j tem implementada a interface //IDisposable e tratado como um objeto gerenciado StreamReader reader; bool disposed = false; //Inicializa o reader public MyReader(string file) { reader = new StreamReader(file); } //Utiliza recursos do reader normalmente public string ReadToEnd() } //Finalizador: //Este metodo o finalizador, que invocado pelo GC //para liberar os recursos. //Todo a liberacao implementada dentro dele s ser //executada quando o metodo for invocado, porm no //conseguimos saber quando isto vai acontecer e recursos //importantes podem ficar presos at que isto acontea. ~MyReader() { Dispose(false); } //Quando o Dispose acionado, os recursos gerenciados e //no gerenciados so liberados e ainda avisamos o GC //para no acionar o finalizador pois ele j no mais necessrio public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } private void Dispose(bool disposing) { { return reader.ReadToEnd();

//Caso o objeto ainda no tenha sido destrudo //libera-se os recursos if (!this.disposed) {

20

//Se o objeto estiver sendo destrudo atravs do mtodo //Dispose libera-se os recursos gerenciados if (disposing) { //Libera recursos gerenciados reader.Dispose(); } //Sempre libera-se os recursos no gerenciados, como utilizao de ponteiros //em chamadas a API do Windows e j assume-se que os recursos foram liberados disposed = true; } }}

9 - Gerenciamento de Memoria

Em O C# assim como o VB e o Java utiliza o gerenciamento DINMICO de memria, ou seja, a memria alocada e desalocada de acordo com a necessidade. Na linguagem C esse trabalho de alocar e desalocar, em parte, fica por responsabilidade do desenvolvedor: Ex: public class Pessoa { Pessoa(){}; // Construtor ~Pessoa(){}; // Destrutor } Nesse caso toda vez que um objeto pessoa instanciado, depois que ele utilizado o destrutor deve ser chamado para liberar o espao de memria utilizado por ele.

J o C# esse trabalho automtico existe o Garbage Collector (GC), que o responsvel para de tempos em tempos desalocar essa memria.

21

O que o GC faz nada mais do que nesses intervalos verificar se existe algum espao na memria que no esteja sendo referenciado pela aplicao ento a esse objeto atribudo o estado Nothing(). Isso quer dizer que existe espao disponvel para o GC limpar e poder ser utilizado pela instncia de outro objeto. O GC responsvel por chamar o destrutor da classe automticamente, no deixando mais essa responsabilidade para o desenvolvedor. Ex: class Pessoa{ int idade; Pessoa(int id){ idade = id; } static void Main(){ for (int i = 0; i < 10; i++){ Pessoa p = new Pessoa(10); } } } Mas existe como chamar o GC de forma manual utilizado a biblioteca System, e o comando System.GC.collect(). Chamando esse mtodo collect() do objeto System.GC ele passa o GC coletando os objetos. Uma das grandes vantagens o melhor gerenciamento de memria, e a ausncia de erros , como o Vazamento de memria causado por ponteiros no alocados.

22

10 - Comandos, Efeitos Colaterais

Os comandos em C# so muito parecidos com JAVA, tais como o operadores unrios: a++, ++a, a+= b, etc, ou binrios +, -, *, /, tambm o operador de atribuiao = . public class TestDoWhile public static void Main () { int x = 0; do { Console.WriteLine(x); x++; } while (x < 5); } } J um comando que utilizado no C# e muito bom o foreach, que varre o array em ordem sequencial. class ForEachTest { static void Main(string[] args){ int[] fibarray = new int[] { 0, 1, 1, 2, 3, 5, 8, 13 }; foreach (int i in fibarray) } } } { System.Console.WriteLine(i); {

Os efeitos colaterais so tradados em C# atravs do tratamento de exceoes, assim como no JAVA. Onde um erro gerado porm no causa a parada da execuo do programa. 23

try{ int i = 0; Console.WriteLine(10/i); }catch { Console.WriteLine(Erro ao dividir por 0); } ou try{ int i = 0; Console.WriteLine(10/i); }catch (DivideByZeroException ex){ Console.WriteLine(ex.Message); }

11 - Correspondncia, Passagem de Parmetros

Correspondncia de parmetros, a capacidade de se declarar im tipo de parmetro e passar outro, onde seja possvel fazer uma correspondncia. Ou seja, o C# aceita converses do tipo int em long porm no aceita long em int, e isso fica claro devido ao tamanho de cada varivel. Um inteiro composto de 4 bytes e um long de 8 bytes, ento obviamente um inteiro pode ser um long porm um long no pode ser um inteiro. Class Pessoa{ long id; Pessoa(int idade){ id = idade } }

24

Nesse caso declaramos o construtor de Pessoa com um parmentro do tipo inteiro e atribumos a uma varivel long.

No C# essa passagem de parmetros pode ser feita de 2 maneiras distintas, ou por valor ou por refncia. Essa uma grande vantagem em relao a outras linguagens de programao, pois isso permite ser controlado de acordo com a necessidade do desenvolvedor e de maneira legvel. Ex: class Pessoa{ public static void concatena(String nome){ Console.WriteLine(Pessoa + nome); } static void Main(){ String nome = Pedro; Pessoa.concatena(nome); Console.WriteLine(nome); } } Nesse caso, quando chamarmos o mtodo concatena da classe Pessoa passando um nome como argumento, o que acontecer que ser feita uma cpia desse nome dentro do mtodo e ser concatenado com pessoa para ser impressoa. Ento minha sada ficaria assim nesse caso: Pessoa Pedro Pedro. Em um segundo caso podemos passar esse parmentro como uma referncia, ou seja, a posio de memria dele.

25

class Pessoa{ public static void concatena(ref String nome){ Console.WriteLine(Pessoa + nome); } static void Main(){ String nome = Pedro; Pessoa.concatena(nome); Console.WriteLine(nome); } } Nesse 2 caso inserimos o atributo ref antes do parmetro da funo. Ento nesse caso o que acontecer que ele passar a referncia de um objeto string que ser alterado dentro da funao. E a sada ficaria assim: Pessoa Pedro Pessoa Pedro. Em C j era utilizada a passagem de parmetros tanto por valor como por referncia onde, quando passamos simplesmente por valor declaramos da mesma maneira que o C# e por referncia o que muda que no lugar do ref colocamos o &. Uma curiosidade em relao ao JAVA que por mais que digamos que as atribuies em java de tipos primitivos seja por valor e os compostos por referncia, isso no acontece com a passagem de parmetros, pois o java s passa parametros por valor, ou seja, ele faz uma cpia.

26

12 - Persistncia

A persistncia de dados ocorre quando eles deixam de ocupar a memria principal do computador, a memria RAM, e ocupam a memria secundria, disco rgido. Quando o dado est na memria principal ele chamado de Transient. Em Fortran as variveis so armazenadas em memria secundria, ou seja quando o arquivo compilado ele gera um espao reservado para alocar as variveis. Isso ruim pois em um caso de recurso, onde a qauntidade de memria cresce sem algum tipo de controle, acaba dando erro por falta de espao. J no C# assim como tambm o Java eles possuem armazenamento de variveis em memria principal de maneira dinmica, e utiliza o armazenamento persistente para dados, ou seja armazenamento de arquivos. Pode-se utilizar tanto armazenamento em arquivo, como tambm o que mais comum de se falar em armazenamento persistente, o armazenamento de Banco de Dados. No C# existe o Entity Framework, assim como no Java existe o Hibernate, que faz esse mapeamento entre a classe e o objeto relacional. Classes prontas para conexo com bancos e execuo de sql. Public void criar{ try{ using (FileStream fs = new File.create(StrPathFile)){ using(StreamWriter sw = new StreamWriter(fs)){ sw.write(Texto Escrito em Arquivo) } 27

} }catch(Exception ex){ } } Nesse exemplo com a classe FileStream criamos um canal entre a nossa aplicao e o sistema de arquivos do computador e depois com o StreamWriter escrevemos no disco a string passada pelo mtodo sw.write.

13 Polimorfismo e Herana

C# uma liguagem totalmente orientada a objetos, desta forma, ela permite a implementao de todos os princpios de orientao a objetos, como a Heranae Polimorfismo. A implementao da herana em C# se d atravs do operador dois-pontos (:), que deve ser utilizado aps o nome da classe especializada que est sendo criada. O C# no suporta Heranas mltiplas por padro, mas, possvel simular uma herana mltipla usando interfaces. Exemplo: public class Angariacao { public string Nome public string Morada public string EpocaBaixa public string EpocaAlta } 28 { get; set; } { get; set; } { get; set; } { get; set; }

public string Enquadramento { get; set; }

public class CasaDeCampo : Angariacao { public int } public class HotelRural : Angariacao { public string Actividades { get; set; } public string Exterior public string AreaSocial } { get; set; } { get; set; } Capacidade { get; set; } { get; set; } public string Tipologia

O Polimorfismo permite, em uma de suas metodologias de aplicao, que diferentes classes tenham mtodos com a mesma assinatura (mesmo contrato), porm estes mtodos (em suas respectivas classes) podem possuir comportamentos diferentes, de acordo necessidade de cada classe que o implementa. A implementao do polimorfismo pode ser realizada fazendo uso de interfaces, ou classes abstratas, onde ocorrem apenas a implementao das assinaturas dos mtodos, ou seja, do contrato. Desta forma o comportamento deve ser implementado nas classes concretas que implementam as interfaces ou estendem as classes abstratas. A forma de implementao da sobrecarga em C# idntica ao ocorrido em Java, apenas redeclarando os mtodos e mudando seus parmetros. Exemplo: public string Nome { get; set; } public void escreverNome() { Console.Write(this.Nome + "\n"); } 29

public void escreverNome(string titulo) { Console.Write(titulo + " " + this.Nome + "\n"); } public void escreverNome(int vezes) { for (int i = 0; i <= vezes; i++) Console.Write(this.Nome + "\n"); }

30

14-BIBLIOGRAFIA - Microsoft Developer Network - http://msdn.microsoft.com


- Linguagens de Programao: Conceitos e Tcnicas - Flavio Miguel Varejao - http://www.codeproject.com/Articles/375166/Functional-programmingin-Csharp#HOF - http://www.alsonkemp.com/haskell/thinking-about-haskell-you-knowlazy-evaluation-you-just-dont-know-it/ - http://blastersystems.com/blog/2010/07/herana-polimorfismo-e-classesabstractas-quick-tips-2/

31