Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas

linguagem C#, Notas de estudo de Informática

linguagem de programação em C sharp

Tipologia: Notas de estudo

Antes de 2010

Compartilhado em 28/05/2009

jaime-coan-9
jaime-coan-9 🇧🇷

4.7

(10)

6 documentos

Pré-visualização parcial do texto

Baixe linguagem C# e outras Notas de estudo em PDF para Informática, somente na Docsity! Página 1 C# Guia de Referência Autor: Fabio Renato de Almeida Página 2 Curso C# 1.0 e 2.0 (Guia de Referência do Aluno) Instrutor: Fábio Renato de Almeida fabiorenato.net@uol.com.br Introdução a Plataforma .net e ao C# - Aula 01 Página 5 ♦ Strong Name. ♦ Toda informaçao possível sobre o assembly está no próprio assembly. • Não há entradas no registro do sistema (GUID). • Privado ou compartilhado (GAC: Global Assembly Cache). • Reflection (Reflexão)... através dos metadados. • Instalação de zero impacto (xcopy). 10. .net Framework - Características.  Interoperabilidade entre linguagens. • Lib1.dll escrita em C#. • Lib2.dll escrita em VB.net herdando de Lib1.dll. • Lib3.dll escrita em Delphi for .net herdando de Lib2.dll. • Lib4.dll escrita em C# herdando de Lib3.dll. • O mecanismo de tratamento de exceções também permite que exceções lançadas na Lib2.dll possam ser devidamente capturadas e tratadas na Lib4.dll. 11. .net Framework - Características.  Interoperabilidade COM. • Uma classe .net wrapper é criada para gerenciar objetos COM. • A tecnologia COM é considerada ultrapassada. • O ideal é escrever as funcionalidades COM em código gerenciável.  Segurança. • Possibilidade de executar um assembly sem risco de código malicioso. • Um assembly pode conter informações sobre quem ou qual grupo tem permissões para executar determinados métodos no assembly [atributos]. • .net oferece segurança baseada em código. Windows oferece segurança baseada em roles (usuário, grupo, domínio, processo) Ex.: código exe da internet => a segurança baseada em código permite determinarmos que o programa não deve executar determinadas operações, como por exemplo, ler ou gravar variáveis de ambiente, alterar o registro do Windows, etc. 12. .net Framework - Características.  Acesso eficiente a dados. • Sem ODBC. • Sem BDE. • O mecanismo de acesso é feito através de um Provider. O ADO.net expõe uma interface padrão para todos os providers. • A característica principal do provider é que ele se comunica “diretamente” com o banco de dados (exceto OLE DB e ODBC providers). • Dados desconectados.  Atributos. • Obsolete. • Conditional. • Flags. • Permite a definição de outros atributos. 13. .net Framework - Runtime.  Compilação (2 fases). • Fase 1: Código fonte é transformado em um assembly (IL). • Fase 2: O compilador JIT (Just In-Time compiler) processa os byte codes da IL e transforma em código nativo específico da plataforma (podendo sofrer otimizações). O código é compilado conforme solicitação.  Managed Code (Código Gerenciado). • CLR (Common Language Runtime). ♦ Aplicações .net são executadas pelo CLR. Este ambiente, através da FCL, abstrai todo o sistema operacional. • GC (Garbage Collector). ♦ Liberação automática de memória. Introdução a Plataforma .net e ao C# - Aula 01 Página 6 ♦ Gerenciamento automático de gerações (0, 1 e 2). ♦ Fim do vazamento de memória (Leak Memory). 14. .net Framework - Linguagens.  Visual Basic .net. • Linguagem adaptada para a plataforma. • Sofreu alterações significativas a ponto de ser considerada uma nova linguagem. • Herda os vícios da plataforma anterior. • A linguagem não é 100% orientada a objetos (O compilador faz adaptações para o ambiente .net).  Delphi for .net. • Linguagem adaptada para a plataforma. • Sofreu menos alterações em relação ao VB. • Também herda os vícios da plataforma anterior. • A linguagem não é 100% orientada a objetos (O compilador faz adaptações para o ambiente .net). 15. .net Framework - Linguagens.  C#. • C# (C Sharp – C Aprimorado). • Projetado especificamente para a plataforma .net. (Nasceu para o .net). • A arquitetura e as metodologias da linguagem C# refletem as metodologias subjacentes do .net. Em muitos casos, as características da linguagem C#, de fato, dependem das características do .net, ou das classes-base do .net. • Linguagem baseada na metodologia moderna do projeto orientado a objetos. • Desenvolvido pela Microsoft: Equipe liderada por Anders Hejlsberg e Scott Wiltamuth. • Fato!!! Grande parte das classes-base do .net foi escrita em C#. • Linguagem orientada a objetos (totalmente). • Suporta sobrecarga de operadores... apesar do .net não suportar este recurso, o compilador C# traduz para uma chamada a método. • Conjunto coerente e bem definido de tipos básicos. 16. .net Framework - Linguagens.  C# (continuação). • Suporte para documentação XML. • Suporte para atributos. • Amplo acesso a FCL. • Fácil acesso a API do Windows (raramente necessário). • Possibilidade de uso de ponteiros e acesso direto a memória (raramente necessário). • Suporte a propriedades e eventos. • Bem mais fácil que C++. • Simples/Moderno/Tipo Seguro (type-safe). • Eficiência da linguagem C++ com a facilidade de ambientes RAD sem a complexidade e problemas de ponteiros, enfim... a junção de tudo o que há de melhor nesses últimos 20 anos. • O fato de C# ter sido projetado especificamente para a plataforma .net, significa que seu suporte ao .net framework é mais completo e também é oferecido em um contexto de uma sintaxe mais apropriada do que outras linguagens. 17. .net Framework - Aplicações.  Tipos de Aplicação. • WebServices (XML). • Windows Services. • ASP.net (ThinClient, requer apenas o browser no cliente): Ao contrário do ASP antigo, o código no lado servidor é compilado. • Console. • Windows Forms (FatClient, requer o .net Framework no cliente). Introdução a Plataforma .net e ao C# - Aula 01 Página 7 18. .net Framework - Conclusão.  Plataforma. • Provavelmente o que reinará nos próximos 20 anos.  Linguagem. • Escolha C#.  .net Compact Framework. • O .net poderá ser portado para. ♦ Pocket PC (já existe). ♦ Celular (já existe). ♦ Enfim... qualquer outro dispositivo, tornando sua aplicação funcional em outros ambientes.  Projeto Mono. • .net Framework para outras plataformas (www.go-mono.com).  Reverse Engineer. • Obfuscation. 19. .net Framework.  Dúvidas? Apresentando C# - Aula 02 Página 10 } // Fornecedor.cs using System; using System.Collections.Generic; using System.Text; namespace SoftFacil.Estok { class Fornecedor { } } // CompraVenda.cs using System; using System.Collections.Generic; using System.Text; namespace SoftFacil.Estok { class Compra { } class Venda { } } // DAL.cs using System; using System.Collections.Generic; using System.Text; namespace SoftFacil.Estok { class Open { public static void OpenDB(string db) { Console.WriteLine(db + " aberto."); } } } // Program.cs using System; using System.Collections.Generic; using System.Text; namespace SoftFacil.Estok { class Program { static void Main(string[] args) { Console.WriteLine("Estok."); Open.OpenDB("Estok.fdb"); Console.ReadLine(); Apresentando C# - Aula 02 Página 11 } } } Nova aplicação console... (Imob.exe) // Modulos.cs using System; using System.Collections.Generic; using System.Text; namespace SoftFacil.Imob { class Imovel { } class Locador { } class Locatario { } } // DAL.cs using System; using System.Collections.Generic; using System.Text; namespace SoftFacil.Imob { class Open { public static void OpenDB(string db) { Console.WriteLine(db + " aberto."); } } } // Program.cs using System; using System.Collections.Generic; using System.Text; namespace SoftFacil.Imob { class Program { static void Main(string[] args) { Console.WriteLine("Imob."); Open.OpenDB("Imob.fdb"); Console.ReadLine(); } } } Criando um assembly (DAL.dll)... Apresentando C# - Aula 02 Página 12 // DAL.cs using System; using System.Collections.Generic; using System.Text; namespace SoftFacil.DataAccessLayer { public class Open { public static void OpenDB(string db) { Console.WriteLine(db + " aberto."); } } } Utilizando o assembly em Estok e Imob... (Add Reference...) SoftFacil.DataAccessLayer.Open.OpenDB("Estok.fdb"); SoftFacil.DataAccessLayer.Open.OpenDB("Imob.fdb"); ou... using SoftFacil.DataAccessLayer; Open.OpenDB("Estok.fdb"); Open.OpenDB("Imob.fdb"); 6. C#...  Que relação existe entre o nome da classe e seu espaço de nome (fullname) com o nome do arquivo que os contem? 7. De volta a Hello World... 8. DLL Hell...  Hell... • App1 acessa versão 1.0 de Lib.dll. • Instala-se App2... App2 sobrescreve versão 1.0 de Lib.dll com versão 2.0 de Lib.dll. • App2 executa. • App1 não executa mais (Lib.dll incompatível). Apresentando C# - Aula 02 Página 15 ou... using System; using System.Collections.Generic; using System.Text; using SoftFacil.DataAccessLayer; using File = SoftFacil.LibFile.Open; namespace SoftFacil.Estok { class Program { static void Main(string[] args) { Console.WriteLine("Estok."); Open.OpenDB("Estok.fdb"); File.OpenFile("Dados.txt"); Console.ReadLine(); } } } 13. Unidade de Compilação (Estrutura geral)... // Source File (.cs) – Compilation Unit using ... [GlobalAttributes ...] namespace ... { using ... ... } namespace ... { using ... ... } Type1 ... Type2 ... 14. namespace / using (segredos)... namespace N1.N2 { class A // N1.N2.A { } class B // N1.N2.B { } } ou namespace N1 { namespace N2 { Apresentando C# - Aula 02 Página 16 class A // N1.N2.A { } class B // N1.N2.B { } } } 15. namespace / using (segredos)... namespace N1.N2 { class A // N1.N2.A { } } namespace N1.N2 { class B // N1.N2.B { } } ou namespace N1.N2 { class A // N1.N2.A { } class B // N1.N2.B { } } 16. namespace / using (segredos)... namespace N1.N2 { class A // N1.N2.A { } } namespace N3 { using A = N1.N2.A; class B : A // N3.B -> N1.N2.A { } } ou namespace N1.N2 { class A // N1.N2.A { } Apresentando C# - Aula 02 Página 17 } namespace N3 { using R = N1.N2; class B : R.A // N3.B -> N1.N2.A { } } 17. namespace / using (segredos)... namespace N1.N2 { class A // N1.N2.A { } } namespace N3 { using R1 = N1; using R2 = N1.N2; using R3 = N1.N2.A; class B { N1.N2.A obj1; // obj1 -> N1.N2.A R1.N2.A obj2; // obj2 -> N1.N2.A R2.A obj3; // obj3 -> N1.N2.A R3 obj4; // obj4 -> N1.N2.A } } 18. namespace / using (segredos)... namespace N1.N2 { class A // N1.N2.A { } } namespace N3 { using N1.N2; class B : A // N3.B -> N1.N2.A { } } 19. namespace / using (segredos)... namespace N1 { class A // N1.A { } } namespace N2 { C# Fundamentos - Aula 03 Página 20 1. C# Fundamentos 2. Keywords... [ ] abstract [ ] event [ ] new [ ] struct [ ] as [ ] explicit [ ] null [ ] switch [ ] base [ ] extern [] object [ ] this [] bool [] false [ ] operator [ ] throw [ ] break [ ] finally [ ] out [] true [] byte [ ] fixed [ ] override [ ] try [ ] case [] float [ ] params [ ] typeof [ ] catch [ ] for [ ] private [] uint [] char [ ] foreach [ ] protected [] ulong [] checked [ ] goto [ ] public [] unchecked [ ] class [ ] if [ ] readonly [ ] unsafe [ ] const [ ] implicit [ ] ref [] ushort [ ] continue [ ] in [ ] return [] using [] decimal [] int [] sbyte [ ] virtual [ ] default [ ] interface [ ] sealed [ ] volatile [ ] delegate [ ] internal [] short [ ] void [ ] do [ ] is [ ] sizeof [ ] while [] double [ ] lock [ ] stackalloc [ ] else [] long [ ] static [ ] enum [] namespace [] string 3. Comentários  Comentários de uma única linha (//).  Comentários de mais de uma linha (/* ... */). /* * Hello World */ using System; using System.Collections.Generic; using System.Text; namespace Curso.CSharp.HelloWorld { class Program { static void Main(string[] args) { Console.WriteLine("Hello World."); Console.ReadLine(); // Aguarda pressionamento da tecla Enter } } } C# Fundamentos - Aula 03 Página 21 Object ValueType SByte Int16 Int32 Single String Char Double Decimal Int64 Boolean Byte UInt16 UInt32 UInt64 struct ... class ... class ... 4. Tipos de dados pré-definidos C# type CTS Common Type System Intervalo / Descrição bits T i p o s V a l o r (S t a c k / P i l h a) Inteiro sbyte System.SByte -128 ... 127 8 short System.Int16 -32,768 ... 32,767 16 int System.Int32 -2,147,483,648 ... 2,147,483,647 32 long L System.Int64 -9,223,372,036,854,775,808 ... 9,223,372,036,854,775,807 64 byte System.Byte 0 ... 255 8 ushort System.UInt16 0 ... 65,535 16 uint U System.UInt32 0 ... 4,294,967,295 32 ulong UL System.UInt64 0 ... 18,446,744,073,709,551,615 64 Ponto Flutuante float F System.Single 7 dígitos de precisão = ±1.5 x 10-45 ... ±3.4 x 1038 32 double D System.Double 15 dígitos de precisão = ±5 x 10-324 ... ±1.7 x 10308 64 Decimal (valores monetários) decimal M System.Decimal 28 dígitos de precisão = ±1.0 x 10-28 ... 7.9 x 1028 128 Booleano bool System.Boolean true ou false (não aceita 0 ou 1) 8 Caractere char System.Char Um único caractere (Unicode 16 bits) ‘\u0000’ a ‘\uFFFF’ ASCII é um subconjunto do Unicode 16 T i p o s R e f e r ê n c i a (H e a p) object System.Object Tudo deriva daqui (raiz da hierarquia de tipos) string System.String String de caracteres unicode 5. Hierarquia int x = 1; // Int32 x = 1; Console.WriteLine(x.ToString()); Gerenciamento de memória: stack / heap. 6. Declaração e inicialização de variáveis tipo identificador; C# Fundamentos - Aula 03 Página 22 tipo identif1, identif2, identif3; tipo identif = valor; tipo identif1 = valor1, identif2 = valor2, identif3 = valor3; tipo identif1, identif2, identif3; identif1 = identif2 = identif3 = valor; Exemplos... short v1; int w1, w2, w3; long v2 = 2; byte x = 1, y = 2, z = 3; int a, b, c; a = b = c = 0; 7. Identificadores...  PascalCase / camelCase.  Case-sensitive.  Deve começar por letra ou sublinhado (underscore).  Pode conter letra, sublinhado ou número.  Acentos são permitidos.  Palavras chaves podem ser usadas como identificadores através do uso de verbatim (@). • Muito útil caso uma classe chamada “bool” tenha sido criada, por exemplo, em Visual Basic, e a estejamos consumindo em C#.  Tamanho!!! qual o limite? 8. Declaração e inicialização de variáveis (exemplos)... sbyte v1; int identif1, identif2, identif3; long v2 = 2; float x = 1.0F, y = 2, z = 3; int a, b, c, d; a = b = c = 0; d = 1; decimal salario = 9900.50M; bool @using = true; char letra = 'A'; string msg = "Hello"; byte caractere1 = 255; byte caractere2 = 0xFF; char letraA1 = 'A'; char letraA2 = '\x0041'; char letraA3 = '\u0041'; char letraA4 = (char)65; ushort codigo = (ushort)letraA1; 9. Sequências de escape (\)...  \’ Aspas Simples  \” Aspas Dupla  \\ Barra Invertida  \0 Nulo (\u0000 = 0)  \a Alerta (\u0007 = 7) C# Fundamentos - Aula 03 Página 25 • Divisão: / • Módulo: %  4º... • Adição/Concatenação: + • Subtração: -  5º... • Deslocamento de bit a esquerda: << • Deslocamento de bit a direita: >> int a = 5 * 2; // a = 10 int b = 11 / 4; // b = 2 (quociente inteiro) int c = 11 % 4; // c = 3 (resto inteiro) int d = 5 + 1; // d = 6 int e = 4 - 2; // e = 2 string f = "C# " + "Language."; // f = "C# Language." int g1 = 5 << 1; // 5 * 2 int g2 = 5 << 2; // 5 * 4 int g3 = 5 << 3; // 5 * 8 int h1 = 5 >> 1; // 5 / 2 int h2 = 5 >> 2; // 5 / 4 int h3 = 5 >> 3; // 5 / 8 double i = 5 / 2; // i = 2 double j = 5.0 / 2; // j = 2.5 double k = 5D / 2; // k = 2.5 16. Operadores (Precedência)...  6º (Relacionais)... • Menor que: < • Maior que: > • Menor ou igua a: <= • Maior ou igual a: >= • Informação de tipo: is, as  7º (Comparação)... • Igual a: == • Diferente de: != char sexo = 'M'; if (sexo == 'M') { Console.WriteLine("Homem"); } else { Console.WriteLine("Mulher"); } 17. Operadores (Precedência)...  8º... And bit-a-bit: &  9º... XOr bit-a-bit: ^  10º... Or bit-a-bit: |  11º... And booleano: &&  12º... Or booleano: || char sexo = 'F'; int idade = 20; if (sexo == 'F' && idade > 18) { Console.WriteLine("Mulher adulta"); } 18. Operadores (Precedência)... C# Fundamentos - Aula 03 Página 26  13º (Ternário)... (associatividade: da direita para a esquerda) • Condicional: ?:  14º (Atribuição)... (associatividade: da direita para a esquerda) • = • += • -= • *= • /= • %= • &= • |= • ^= • <<= • >>= char sexo = 'M'; Console.WriteLine(sexo == 'M' ? "Homem" : "Mulher"); int tot = 0; tot = tot + 1; // ou tot++; // ou ++tot; // ou tot += 1; 19. Exponenciação...  Não existe operador para exponenciação em C#.  Math.Pow(). double r = Math.Pow(5, 2); // r = 5 ao quadrado = 25 20. Conversões...  Implícitas... • De sbyte para short, int, long, float, double, decimal. • De byte para short, ushort, int, uint, long, ulong, float, double, decimal. • De short para int, long, float, double, decimal. • De ushort para int, uint, long, ulong, float, double, decimal. • De int para long, float, double, decimal. • De uint para long, ulong, float, double, decimal. • De long, ulong para float, double, decimal (repare no float como conversão implícita, o resultado é menos preciso, mas a magnitude do número é preservada). • De float para double. • De char para ushort, int, uint, long, ulong, float, duble, decimal. • Via de regra... sempre de um tipo menor para um tipo maior.  Explícitas... • De modo análogo, toda conversão de um tipo maior para um menor deverá ser feita explicitamente através de casting. short a = 1000; byte b1 = (byte)a; // não causa overflow byte b2 = checked((byte)a); // causa overflow double preco = 8.9; int valor1 = (int)preco; // valor1 = 8 int valor2 = (int)(preco + 0.5); // Arredonda para o inteiro mais próximo char c = (char)65; // caractere ‘A’ int codigoCaractereA = 'A'; // = 65 (conversão implícita) C# Fundamentos - Aula 03 Página 27 21. Conversões...  Entre números e strings... • De número para string... int i = 10; string s = i.ToString(); • De string para número... string s = "10"; int i = int.Parse(s); 22. Ponto Flutuante... 1.0/0.0 = +Infinito -1.0/0.0 = -Infinito 0.0/0.0 = NaN (Not-a-Number) double x = 1.0 / 0; // +Infinito double y = -1.0 / 0; // -Infinito double z = 0.0 / 0; // NaN (Not-a-Number) Console.WriteLine(x); Console.WriteLine(y); Console.WriteLine(z); 23. System.Console (noções básicas)  Console.Write(...);  Console.WriteLine(“{0} mais {1} é igual a {2}.”, i, j, i + j);  {argumento[,largura[:formato]]}  +largura : alinha a direita  -largura : alinha a esquerda  Formato... • Cn ou cn: monetário com n casas decimais. • Dn ou dn: preenche um inteiro com n zeros. • E ou e: formato exponencial. • Fn ou fn: número de ponto flutuante com n casas decimais. • G ou g: usa a formatação E ou F dependendo do que for mais compacto. • N ou n: formato numérico estilo 999.999.999,99 (Brasil). • P ou p: formato percentual. • Xn ou xn: formato hexadecimal de n dígitos. 24. Main  Ponto de entrada (startup) de qualquer executável em C#.  Possíveis assinaturas... • static void Main(string[] args) • static void Main() • static int Main(string[] args) • static int Main() 25. Boxing/Unboxing  Boxing é a transformação de um tipo valor em um tipo referência (da pilha para o heap).  Unboxing é a transformação de um tipo valor alocado no heap para um tipo valor alocado na pilha. int i = 10; object obj = i; // boxing int j = (int)obj; // unboxing Estruturas de Controle - Aula 04 Página 30 1. Estruturas de Controle 2. Keywords... [ ] abstract [ ] event [ ] new [ ] struct [ ] as [ ] explicit [ ] null [] switch [ ] base [ ] extern [] object [ ] this [] bool [] false [ ] operator [ ] throw [] break [ ] finally [ ] out [] true [] byte [ ] fixed [ ] override [ ] try [] case [] float [ ] params [ ] typeof [ ] catch [] for [ ] private [] uint [] char [] foreach [ ] protected [] ulong [] checked [] goto [ ] public [] unchecked [ ] class [] if [ ] readonly [ ] unsafe [ ] const [ ] implicit [ ] ref [] ushort [] continue [] in [ ] return [] using [] decimal [] int [] sbyte [ ] virtual [] default [ ] interface [ ] sealed [ ] volatile [ ] delegate [ ] internal [] short [ ] void [] do [ ] is [ ] sizeof [] while [] double [ ] lock [ ] stackalloc [] else [] long [ ] static [ ] enum [] namespace [] string 3. Blocos de Código { declarações... instruções... { declarações... instruções... } } 4. if/else if (condição) instrução; if (condição) instrução; else instrução; if (condição) { instruções... } if (condição) { instruções... Estruturas de Controle - Aula 04 Página 31 } else { instruções... } 5. if/else Exemplo 1 if (idade >= 18 && sexo == 'M') { Console.WriteLine("Homem maior de idade."); } Exemplo 2 if (cargo == "Presidente") { // Presidente } else if (cargo == "Analista") { // Analista } else if (cargo == "Telefonista") { // Telefonista } else { // Outros } 6. goto label: instrução; instrução; ... goto label; Exemplo { inicio: Console.Write("C# "); goto inicio; } 7. switch switch (variável) { case constante1: ... break; case constante2: ... goto case constante; case constante3: case constante4: ... Estruturas de Controle - Aula 04 Página 32 break; default: ... break; } 8. switch string pais = "Brasil"; string lingua = string.Empty; switch (pais) { case "Brasil": case "Portugal": lingua = "Português"; break; case "EUA": lingua = "Inglês"; break; default: Console.WriteLine("País não cadastrado."); goto case "EUA"; } 9. for for (inicializador; condição; iteração) { ... break; // aborta o laço continue; // executa a próxima iteração, depois avalia a condição } Exemplo for (int i = 0; i < 10; i++) { if (i == 6) { continue; } Console.WriteLine(i); } 10. while while (condição) { ... break; // aborta o laço continue; // avalia a condição e continua ou não o laço } Exemplo int i = 0; while (i < 10) { Console.WriteLine(i); i++; } 11. do ... while Programação Orientada a Objetos - Aula 05 Página 35 1. Programação Orientada a Objetos (Object Oriented Programming – OOP) 2. Keywords... [] abstract [ ] event [] new [ ] struct [] as [] explicit [] null [] switch [] base [] extern [] object [] this [] bool [] false [] operator [ ] throw [] break [ ] finally [] out [] true [] byte [ ] fixed [] override [ ] try [] case [] float [] params [] typeof [ ] catch [] for [] private [] uint [] char [] foreach [] protected [] ulong [] checked [] goto [] public [] unchecked [] class [] if [] readonly [ ] unsafe [] const [] implicit [] ref [] ushort [] continue [] in [] return [] using [] decimal [] int [] sbyte [] virtual [] default [ ] interface [] sealed [ ] volatile [ ] delegate [] internal [] short [] void [] do [] is [ ] sizeof [] while [] double [ ] lock [ ] stackalloc [] else [] long [] static [ ] enum [] namespace [] string 3. Introdução  Linguagem de programação... • Procedimental (Orientada a Ações). A unidade de programação é a função. ♦ Visual Basic ♦ Pascal ♦ Cobol ♦ Clipper ♦ C, C++ • Orientada a Objetos. A unidade de programação é a classe. ♦ C# • Mista. Suporta programação por classe e procedimental. ♦ Delphi ♦ Delphi for .net ♦ Visual Basic .net 4. OOP  Não é suficiente aprender apenas a sintaxe básica de uma linguagem de programação... • Declaração de variáveis. • Controle de fluxo. • Escopo, etc.  É necessário e fundamental construir código de qualidade... • Um profundo conhecimento dos princípios e metodologias por trás da linguagem irá garantir a construção de um código moderno e mais eficiente. • Na OOP... ♦ O principal fundamento é a herança. Programação Orientada a Objetos - Aula 05 Página 36 ⇒ Herança de Implementação (classe base). ⇒ Herança de Interface (uma ou mais interfaces). 5. OOP e o mundo real  Considere um objeto do mundo real... (o rádio de seu carro) • Você sabe trocar as estações de rádio. • Você sabe como regular o volume. • Você sabe como reproduzir um CD de áudio. • Mas... ♦ Você sabe como ele funciona internamente? ♦ Você sabe o número de rotações necessárias para a leitura do CD? ♦ Você conhece os fundamentos de Hertz na sintonização da estação?  O rádio... na OOP é um objeto... • Os controles de regulagem de estação, volume, e CD são os mecanismos com os quais o usuário tem acesso direto... dizemos na OOP que trata-se da Interface. • O funcionamento interno, na realidade, não interessa a pessoa que utiliza o dispositivo. Neste caso, na OOP, dizemos que o funcionamento interno esta encapsulado. 6. OOP e o mundo real  Se trocarmos o rádio por um modelo mais novo... • O novo modelo, muito provavelmente, foi construído pelo fabricante levando-se em consideração as funcionalidades já prontas no modelo anterior (diz se que o novo modelo herdou as caracteristicas do anterior, mas é claro, acrescentando novos recursos). • Seu funcionamento interno, provavelmente será totalmente diferente. • Mas tudo bem... isso não interessa para o usuário do rádio... pois a interface basicamente se manteve a mesma... • Desta forma, o usuário, sem maiores problemas, conseguirá utilizar o novo rádio (o novo objeto).  OOP na Engenharia de Software... • Este mesmo princípio deve ser adotado na construção de software em C#. ♦ Encapsulamento. ♦ Interface. ♦ Herança. 7. Classes  Modelos com base nos quais podemos criar objetos.  Objetos instanciados de uma determinada classe, passam a ter as características definidas na classe.  Membros da classe... • Dados (membros de armazenamento)... ♦ Constantes. ♦ Campos. ♦ Eventos. • Funções (membros que contém código)... ♦ Construtores. ♦ Destrutor. ♦ Propriedades. ♦ Métodos. ♦ Indexadores. ♦ Operadores. • Outros tipos (nested types)... ♦ Classes, estruturas, etc. 8. Instanciando um objeto Tipo identificador = new Tipo(...); // Declara um identificador do tipo DateTime, Programação Orientada a Objetos - Aula 05 Página 37 // cria uma instância de um objeto DateTime na pilha // e o inicializa com 25 de Dezembro de 2005. DateTime natal = new DateTime(2005, 12, 25); // Declara três identificadores do tipo int (n1, n2 e n3), // cria três instâncias de objetos int na pilha // e os inicializa com o valor 0 (zero). Int32 n1 = new Int32(); int n2 = new int(); int n3 = 0; // Declara um identificador do tipo int, // mas nenhum objeto é instanciado... // n4 não está inicializado. int n4; // Declara um identificador do tipo Horario, // cria uma instância de um objeto no heap // e o inicializa com 9 horas 10 minutos e 20 segundos. Horario horario = new Horario(9, 10, 20); 9. Assembly: Tempo.dll namespace Curso.CSharp.Tempo { class Horario { byte hora, minuto, segundo; Horario(byte h, byte m, byte s) { hora = h; minuto = m; segundo = s; } } } 10. Modificadores de Acesso namespace ... { internal public class Horario { ... private public internal Horario(...) protected protected internal { ... } } } 11. Modificadores de Acesso  private: o recurso é acessível somente dentro do tipo onde foi declarado... o recurso faz parte do funcionamento interno (encapsulamento).  public: o recurso é acessível dentro e fora do assembly. Programação Orientada a Objetos - Aula 05 Página 40 } set { if (value >= 0 && value <= 59) { minuto = value; } } } public byte Segundo { get { return segundo; } set { if (value >= 0 && value <= 59) { segundo = value; } } } } 18. Sobrecarga (overload) de construtores public Horario(byte hora, byte minuto, byte segundo) : base() { Hora = hora; Minuto = minuto; Segundo = segundo; } public Horario(byte hora, byte minuto) : this(hora, minuto, 0) { } public Horario(byte hora) : this(hora, 0, 0) { } public Horario() : this(0, 0, 0) { } 19. Métodos // Um método que não retorna nenhum valor, // deve ser declarado como void. public void AddHoras(int horas) { Hora = (byte)((Hora + horas) % 24); } public string ToHora12() { return string.Format("{0:d2}:{1:d2}:{2:d2}", Hora == 0 || Hora == 12 ? 12 : Hora % 12, Minuto, Segundo ) + (Hora < 12 ? " AM" : " PM"); } Programação Orientada a Objetos - Aula 05 Página 41 Horario FusoHorario Object public string ToHora24() { return string.Format("{0:d2}:{1:d2}:{2:d2}", Hora, Minuto, Segundo ); } 20. Inicialização e escopo de variáveis...  O compilador C# dá enfase a segurança quando o assunto é inicialização de variáveis, ou seja, toda variável deve ser inicializada antes de ser trabalhada.  Variáveis que são campos de uma classe ou estrutura são zeradas por padrão tão logo uma instância da classe ou estrutura seja criada.  Variáveis locais a um método deverão ser explicitamente inicializadas antes de qualquer instrução na qual elas apareçam.  Escopo...  Região de código onde a variável de fato existe.  Uma variável de classe (campo) existe dentro da classe.  Uma variável local existe dentro do bloco no qual foi declarada.  Uma variável declarada num laço for tem escopo somente dentro deste laço. 21. Herança public class FusoHorario : Horario { string pais; public FusoHorario(string pais, byte hora, byte minuto, byte segundo) : base(hora, minuto, segundo) { this.pais = pais; } new public string ToHora12() { return pais + ", " + base.ToHora12(); } new public string ToHora24() { return pais + ", " + base.ToHora24(); } } 22. Relacionamento (é um) is Horario horario = new Horario(9, 10, 2); FusoHorario fusoHorario = new FusoHorario("Brasil", 21, 18, 10); Programação Orientada a Objetos - Aula 05 Página 42 if (horario is object) Console.WriteLine("horario is object"); if (horario is Horario) Console.WriteLine("horario is Horario"); if (horario is FusoHorario) Console.WriteLine("horario is FusoHorario"); if (fusoHorario is object) Console.WriteLine("fusoHorario is object"); if (fusoHorario is Horario) Console.WriteLine("fusoHorario is Horario"); if (fusoHorario is FusoHorario) Console.WriteLine("fusoHorario is FusoHorario"); 23. Chamada a método via classe base Horario horario = new Horario(9, 10, 2); Horario fusoHorario = new FusoHorario("Brasil", 9, 10, 2); Console.WriteLine(horario.ToHora12()); Console.WriteLine(fusoHorario.ToHora12()); Console.ReadLine(); 09:10:02 AM 09:10:02 AM 24. Polimorfismo public class Horario : object { ... public virtual string ToHora12() { ... } public virtual string ToHora24() { ... } } public class FusoHorario : Horario { ... public override string ToHora12() { ... } public override string ToHora24() { ... } } 09:10:02 AM Brasil, 09:10:02 AM 25. Lidando com diferentes versões de classe  1º - Você utiliza uma biblioteca de terceiros (Lib.dll)... Esta biblioteca possui uma classe definida da seguinte forma: class Imposto : object { ... }  Lib.dll está na versão 1.0.100.200 e encontra-se instalada no GAC. Programação Orientada a Objetos - Aula 05 Página 45 static int Soma(int x, int y) { return x + y; } static int Soma(int x, int y, int z) { return x + y + z; } static long Soma(int x, int y, int z) // inválido { return x + y + z; } 34. is (verificando tipo antes de fazer casting) static void Main(string[] args) { FusoHorario fuso = new FusoHorario("Brasil", 10, 20, 30); string str = "C#"; int num = 1; ShowString(fuso); ShowString(str); ShowString(num); Console.ReadLine(); } static void ShowString(object obj) { if (obj is Horario) { Horario h = (Horario)obj; Console.WriteLine(h.ToHora12()); } else { Console.WriteLine(obj.ToString()); } } 35. utilizando as... static void ShowString(object obj) { Horario h = obj as Horario; if (h != null) { Console.WriteLine(h.ToHora12()); } else { Console.WriteLine(obj.ToString()); } } Escrever... Horario h = obj as Horario; é o mesmo que... Horario h = obj is Horario ? (Horario)obj : (Horario)null; 36. Overriding ToString()... public class Horario : object { ... Programação Orientada a Objetos - Aula 05 Página 46 public override string ToString() { return ToHora12(); } } ... static void ShowString(object obj) { Console.WriteLine(obj.ToString()); } 37. Membros de instância X Membros estáticos  Membros de instância pertencem ao objeto instanciado. • Cada objeto instanciado possui seu próprio conjunto de dados. • Quando não especificamos a palavra chave static, definimos um membro de instância.  Membros estáticos pertencem a classe, não importando se há ou não a existência de uma instância da classe. • Cada classe possui um e apenas um conjunto de dados estáticos. • Quando especificamos a palavra chave static, definimos um membro estático, ou seja, um membro de classe. • Um membro estático deve processar somente dados estáticos, a não ser é claro que uma referência a um objeto seja passada durante a chamada. 38. Tempo decorrido entre uma hora e outra... Horario inicio = new Horario(16, 30, 0); Horario termino = new Horario(20, 0, 0); Horario duracao = termino - inicio; Console.WriteLine(duracao.ToHora24()); Console.WriteLine(Horario.Subtract(termino, inicio).ToHora24()); 39. Tempo decorrido entre uma hora e outra... public class Horario : object { ... public static Horario Subtract(Horario horaFinal, Horario horaInicial) { return horaFinal - horaInicial; } public static Horario operator -(Horario horaFinal, Horario horaInicial) { int segundosFinal = horaFinal.Hora * 3600 + horaFinal.Minuto * 60 + horaFinal.Segundo; int segundosInicial = horaInicial.Hora * 3600 + horaInicial.Minuto * 60 + horaInicial.Segundo; if (segundosFinal < segundosInicial) { return new Horario(); } int segundos = segundosFinal - segundosInicial; byte hora = (byte)(segundos / 3600); byte minuto = (byte)((segundos - hora * 3600) / 60); byte segundo = (byte)(segundos - (hora * 3600 + minuto * 60)); return new Horario(hora, minuto, segundo); } } Programação Orientada a Objetos - Aula 05 Página 47 40. Operadores public class Numero { int numero; public Numero(int numero) { this.numero = numero; } public static implicit operator Numero(int x) { return new Numero(x); } public static explicit operator int(Numero x) { return x.numero; } public static Numero operator +(Numero x, Numero y) { return new Numero(x.numero + y.numero); } } Utilizando... Numero a = new Numero(1); Numero b = 2; int c = (int)b; Numero d = a + b; 41. Classes Abstratas  Uma classe abstrata é uma classe projetada com o propósito de ser utilizada apenas como uma classe base.  Classes abstratas não podem ser instanciadas. public abstract class ComponenteVisual { int largura, altura; ... } public class Botao2D : ComponenteVisual { ... } public class Botao3D : ComponenteVisual { ... } 42. Métodos abstratos  Um método abstrato define um membro virtual, porém, sem implementação.  Um método abstrato só pode ser definido numa classe que foi, também, declarada como abstract.  Toda classe concreta derivada da classe que definiu o método abstrato, deve, obrigatoriamente, criar um corpo para este método. public abstract class ComponenteVisual Programação Orientada a Objetos - Aula 05 Página 50 49. Indexadores  Permitem tratarmos as classes sintaticamente como se fossem arrays. • Ideal para classes que contenham conjunto de dados (coleções). public class Notas { double[] notas; public Notas(params double[] notas) { this.notas = new double[notas.Length]; for (int i = 0; i < notas.Length; i++) { this.notas[i] = notas[i]; } } public double Media() { double total = 0D; foreach (double nota in notas) { total += nota; } return total / notas.Length; } public double this[int index] { get { return notas[index]; } set { notas[index] = value; } } } Utilizando... Notas notas = new Notas(9D, 5.8, 10D); Console.WriteLine("Nota 1 = {0}", notas[0]); Console.WriteLine("Nota 2 = {0}", notas[1]); Console.WriteLine("Nota 3 = {0}", notas[2]); Console.WriteLine(notas.Media()); 50. typeof Horario h = new FusoHorario("Brasil", 21, 13, 10); if (h.GetType() == typeof(Horario)) { Console.WriteLine("h é uma instância de Horario."); // Não exibe } if (h.GetType() == typeof(FusoHorario)) { Console.WriteLine("h é uma instância de FusoHorario."); // Exibe } Programação Orientada a Objetos - Aula 05 Página 51 51. Gerenciamento de Memória Numero obj1 = new Numero(5); Numero obj2 = new Numero(5); if (obj1 != obj2) Console.WriteLine("obj1 != obj2"); // Exibe Numero obj3 = obj1; if (obj3 == obj1) Console.WriteLine("obj3 == obj1"); // Exibe string x, y; x = "C# Language"; y = "C# Language"; // Há uma otimização do compilador neste ponto // para a string anterior. if (x == y) Console.WriteLine("x == y"); // Exibe // O operador == está sobrecarregado para comparar o conteúdo // e não o endereço dos objetos. 52. Construtores de instância e estáticos  Construtores de instância podem ser sobrecarregados.  Só pode haver um construtor estático por classe... static NomeClasse() { // inicialização de dados estáticos somente } 53. Construtores public class Classe1 : object { int x, y; public Classe1(int x, int y) : base() { this.x = x; this.y = y; } public Classe1(int x) : this(x, -1) { } public Classe1() : this(-1, -1) { } } 54. Construtores public class Classe2 : Classe1 { int z; public Classe2(int x, int y, int z) : base(x, y) { this.z = z; } public Classe2(int x, int y) : this(x, y, -1) { } public Classe2(int x) : this(x, -1, -1) { Programação Orientada a Objetos - Aula 05 Página 52 } public Classe2() : this(-1, -1, -1) { } } 55. Construtores public class Classe1 : object { int x, y; public Classe1(int x, int y) : base() { Console.WriteLine("Classe1(int x, int y)"); this.x = x; this.y = y; } public Classe1(int x) : this(x, -1) { Console.WriteLine("Classe1(int x)"); } public Classe1() : this(-1, -1) { Console.WriteLine("Classe1()"); } } 56. Construtores public class Classe2 : Classe1 { int z; public Classe2(int x, int y, int z) : base(x, y) { Console.WriteLine("Classe2(int x, int y, int z)"); this.z = z; } public Classe2(int x, int y) : this(x, y, -1) { Console.WriteLine("Classe2(int x, int y)"); } public Classe2(int x) : this(x, -1, -1) { Console.WriteLine("Classe2(int x)"); } public Classe2() : this(-1, -1, -1) { Console.WriteLine("Classe2()"); } } 57. Construtores (sequência de chamada) Console.WriteLine("a..."); Classe1 a = new Classe1(); // Classe1(int x, int y) // Classe1() Estruturas - Aula 06 Página 55 ValueType struct Object 1. Estruturas 2. Keywords... [] abstract [ ] event [] new [] struct [] as [] explicit [] null [] switch [] base [] extern [] object [] this [] bool [] false [] operator [ ] throw [] break [ ] finally [] out [] true [] byte [ ] fixed [] override [ ] try [] case [] float [] params [] typeof [ ] catch [] for [] private [] uint [] char [] foreach [] protected [] ulong [] checked [] goto [] public [] unchecked [] class [] if [] readonly [ ] unsafe [] const [] implicit [] ref [] ushort [] continue [] in [] return [] using [] decimal [] int [] sbyte [] virtual [] default [ ] interface [] sealed [ ] volatile [ ] delegate [] internal [] short [] void [] do [] is [ ] sizeof [] while [] double [ ] lock [ ] stackalloc [] else [] long [] static [ ] enum [] namespace [] string 3. Estruturas  Classes são tipo referência (heap).  Estruturas são tipo valor (pilha ou inline)... • Ideal para ocasiões em que precisamos de algo muito parecido com as classes, mas sem o custo envolvido na criação de objetos no heap. • Não suportam herança. • O compilador sempre fornece um construtor vazio (sem nenhum parâmetro), que nunca poderá ser substituído. ♦ Devido a problemas de implementação no runtime do .net, a Microsoft optou por proibir a criação de construtores sem parâmetros para estruturas... eles sempre existirão e você não poderá fazer nada para modificá-los ou mesmo, ocultá-los. struct Point { int x, y; public Point(int x, int y) { this.x = x; this.y = y; } } 4. Modificadores de Acesso namespace ... { Estruturas - Aula 06 Página 56 internal public struct ... { ... private public internal Constructor(...) protected protected internal { ... } } } 5. Estruturas x Classes  Membros de uma estrutura... • Dados (membros de armazenamento)... ♦ Constantes. ♦ Campos. ♦ Eventos. • Funções (membros que contém código)... ♦ Construtores. ♦ Destrutor. ♦ Propriedades. ♦ Métodos. ♦ Indexadores. ♦ Operadores. • Outros tipos (nested types)... ♦ Classes, estruturas, etc. 6. Point struct Point { int x, y; public Point(int x, int y) { this.x = x; this.y = y; } public int X { get { return x; } set { x = value; } } public int Y { get Estruturas - Aula 06 Página 57 { return y; } set { y = value; } } public override string ToString() { return string.Format("({0}, {1})", x, y); } } Utilizando... Point p1 = new Point(1, 2); Point p2 = p1; p1.X = 10; Console.WriteLine(p1.ToString()); // (10, 2) Console.WriteLine(p2.ToString()); // (1, 2) 7. Limitações das Estruturas  Não é possível inicializar campos durante sua declaração (a não ser campos estáticos e constantes).  Não suportam herança de implementação... mas permitem herança de interface.  Estruturas, por serem tipo valor, não podem receber null.  O operador de igualdade (==) não pode ser utilizado para comparar estruturas. • if (p1 == p2) ... // erro • if (p1.Equals(p2)) ... // certo struct Point { int x = 1, y = 2; // erro ... } Point p1 = new Point(1, 2); Point p2 = new Point(1, 2); if (p1.Equals(p2)) Console.WriteLine("p1 == p2"); 8. Classes x Estruturas (A diferença entre a vida e a morte) struct Point { int x, y; public Point(int x, int y) { this.x = x; this.y = y; } } Utilizando... Point[] points = new Point[100]; for (int i = 0; i < 100; i++) points[i] = new Point(i, i); // 1 objeto do tipo "Array de Points" com 100 elementos é criado. // Cada elemento no array contém o par de dados x, y. // Desta forma temos apenas 1 objeto alocado no Heap. Interfaces - Aula 07 Página 60 } abstract class Animado : Corpo { void MoveTo(int x, int y, int z) { ... } } abstract class Inanimado : Corpo { } 5. Implementação interface IMortal { void Die(); } class Homem : Animado, IMortal { int idade; public void Die() { if (idade > 99) { ... } } } class Arvore : Inanimado, IMortal { int nivelNutrienteSolo; public void Die() { if (nivelNutrienteSolo < 9) { ... } } } 6. Aplicabilidade static void KillAll(object[] objs) { foreach (object obj in objs) { if (obj is IMortal) { ((IMortal)obj).Die(); } } } ou... (sem interfaces) static void KillAll(object[] objs) { Interfaces - Aula 07 Página 61 foreach (object obj in objs) { if (obj is Homem) { ((Homem)obj).Die(); } if (obj is Arvore) { ((Arvore)obj).Die(); } ... } } 7. Interface  Por padrão, utiliza-se notação húngara (I...) para nomeação de interfaces.  Uma interface define um contrato.  Uma classe ou estrutura, que “herda” uma interface, de fato, assina um contrato com o compilador dizendo que irá, implicita ou explicitamente, implementar todos os membros declarados na interface.  Uma classe ou estrutura pode implementar uma ou mais interfaces.  Uma interface também pode herdar de outras interfaces.  Uma interface pode conter... • Propriedades. • Métodos. • Eventos. • Indexadores.  Tudo o que uma interface contem são assinaturas para seus membros.  Os membros da interface são sempre públicos. 8. Exemplo interface IControl { void Paint(); } interface ITextBox : IControl { void SetText(string text); } interface IListBox : IControl { void SetItems(string[] items); } interface IComboBox : ITextBox, IListBox { } class MyComboBox : IComboBox { public void Paint() { } public void SetText(string text) { } public void SetItems(string[] items) Interfaces - Aula 07 Página 62 { } } 9. Exemplo interface IStringList { void Add(string text); bool Remove(string text); int Count { get; } string this[int index] { get; set; } } 10. Implementação Explícita interface IInterface1 { void DoSomething(); } interface IInterface2 { void DoSomething(); } class MyClass : IInterface1, IInterface2 { void IInterface1.DoSomething() { Console.WriteLine("Do by Interface 1"); } void IInterface2.DoSomething() { Console.WriteLine("Do by Interface 2"); } } invocando... MyClass mc = new MyClass(); ((IInterface1)mc).DoSomething(); ((IInterface2)mc).DoSomething(); 11. Implementação Explícita class MyClass : IInterface1, IInterface2 { void IInterface1.DoSomething() { Console.WriteLine("Do by Interface 1"); } void IInterface2.DoSomething() Enumerações - Aula 08 Página 65 Verde, // Verde = 4 Roxa = 10, // Roxa = 10 Marrom, // Marrom = 11 Preta = 3 // Preta = 3 } utilizando... Faixa faixa = Faixa.Marrom; Console.WriteLine((int)faixa); // 11 Console.WriteLine(faixa.ToString()); // Marrom 5. Flags public enum EnumSemFlags { A = 1, B = 2, // 3 = 3 C = 4, // 5 = 5 // 6 = 6 // 7 = 7 D = 8 // 9 = 9 // 10 = 10 // 11 = 11... } [Flags] public enum EnumComFlags { A = 1, B = 2, // 3 = A, B C = 4, // 5 = A, C // 6 = B, C // 7 = A, B, C D = 8 // 9 = A, D // 10 = B, D // 11 = A, B, D } utilizando... EnumSemFlags esf = (EnumSemFlags)3; Console.WriteLine(esf.ToString()); // 3 EnumComFlags ecf = (EnumComFlags)3; Console.WriteLine(ecf.ToString()); // A, B 6. Flag booleano [Flags] enum Permissao { Read = 1, Write = 2, ReadWrite = Read | Write, Copy = 4, Delete = 8 } Enumerações - Aula 08 Página 66 utilizando... Permissao usuario = Permissao.Copy | Permissao.ReadWrite; if ((usuario & Permissao.Copy) == Permissao.Copy) { Console.WriteLine("Permissão de cópia."); } if ((usuario & Permissao.Read) == Permissao.Read) { Console.WriteLine("Permissão de leitura."); } if ((usuario & Permissao.Write) == Permissao.Write) { Console.WriteLine("Permissão de gravação."); } 7. C#  Dúvidas? Delegações e Eventos - Aula 09 Página 67 Delegate MulticastDelegate Object minhas delegações 1. Delegações e Eventos 2. Keywords... [] abstract [] event [] new [] struct [] as [] explicit [] null [] switch [] base [] extern [] object [] this [] bool [] false [] operator [ ] throw [] break [ ] finally [] out [] true [] byte [ ] fixed [] override [ ] try [] case [] float [] params [] typeof [ ] catch [] for [] private [] uint [] char [] foreach [] protected [] ulong [] checked [] goto [] public [] unchecked [] class [] if [] readonly [ ] unsafe [] const [] implicit [] ref [] ushort [] continue [] in [] return [] using [] decimal [] int [] sbyte [] virtual [] default [] interface [] sealed [ ] volatile [] delegate [] internal [] short [] void [] do [] is [ ] sizeof [] while [] double [ ] lock [ ] stackalloc [] else [] long [] static [] enum [] namespace [] string 3. delegate  As delegações são “parecidas” com ponteiros para funções.  No entanto, as delegações também são totalmente orientadas a objetos.  Uma delegação encapsula dados do método a ser invocado, bem como também se este é um método de instância ou estático.  Uma delegação pode referenciar “apontar” mais de um método no mesmo objeto ou em objetos diferentes, desde que todos possuam a mesma assinatura e tipo de retorno.  Quando uma instância da delegação é invocada, todas as entidades referenciadas por ela serão invocadas com os mesmos argumentos passados para a delegação. delegate void SomeMethod(); delegate int Calcula(int x, int y); 4. delegate class Program { delegate void SomeMethod(); Delegações e Eventos - Aula 09 Página 70 this.valorRequisitado = valorRequisitado; } public decimal SaldoAtual { get { return saldoAtual; } } public decimal ValorRequisitado { get { return valorRequisitado; } } } 10. Eventos public delegate void SaldoNaoDisponivelEventHandler(object sender, SaldoNaoDisponivelEventArgs e); public class Conta : object { decimal saldo; public Conta(decimal saldo) : base() { this.saldo = saldo; } public event SaldoNaoDisponivelEventHandler SaldoNaoDisponivel; public void Debita(decimal valor) { if (valor <= saldo) { saldo -= valor; } else { OnSaldoNaoDisponivel(saldo, valor); } } protected virtual void OnSaldoNaoDisponivel(decimal saldo, decimal valor) { if (SaldoNaoDisponivel != null) { SaldoNaoDisponivel(this, new SaldoNaoDisponivelEventArgs(saldo, valor)); } } } 11. Eventos class Program { static void Main(string[] args) { Delegações e Eventos - Aula 09 Página 71 Conta conta = new Conta(1000M); conta.SaldoNaoDisponivel += new SaldoNaoDisponivelEventHandler(conta_SaldoNaoDisponivel); conta.Debita(200); // Restam 800 conta.Debita(500); // Restam 300 conta.Debita(400); // Gera evento } static void conta_SaldoNaoDisponivel(object sender, SaldoNaoDisponivelEventArgs e) { Console.WriteLine("Saldo atual = {0:C}\nValor requisitado = {1:C}", e.SaldoAtual, e.ValorRequisitado); } } 12. C#  Dúvidas? Exceções - Aula 10 Página 72 1. Exceções 2. Keywords... [] abstract [] event [] new [] struct [] as [] explicit [] null [] switch [] base [] extern [] object [] this [] bool [] false [] operator [] throw [] break [] finally [] out [] true [] byte [ ] fixed [] override [] try [] case [] float [] params [] typeof [] catch [] for [] private [] uint [] char [] foreach [] protected [] ulong [] checked [] goto [] public [] unchecked [] class [] if [] readonly [ ] unsafe [] const [] implicit [] ref [] ushort [] continue [] in [] return [] using [] decimal [] int [] sbyte [] virtual [] default [] interface [] sealed [ ] volatile [] delegate [] internal [] short [] void [] do [] is [ ] sizeof [] while [] double [ ] lock [ ] stackalloc [] else [] long [] static [] enum [] namespace [] string 3. Exceção (Exception)  Uma exceção é um objeto criado (lançado) quando uma determinada condição de erro em particular ocorre.  Esse objeto contem informações que devem ajudar a rastrear o problema. exceções lançadas pelo runtime do .net ou gerais crie suas exceções a partir de ApplicationException Object Exception SystemException ApplicationException ArgumentException ArgumentNullException ArgumentOutOfRangeException ArithmeticException OverflowException MinhaExcecaoException DivideByZeroException Exceções - Aula 10 Página 75  Propriedades... • Alimentadas automaticamente pelo runtime do .net... ♦ Source: Nome da aplicação (montagem) responsável pela exceção. ♦ StackTrace: Rastreamento de chamada de método na pilha. ♦ TargetSite: Objeto de reflexão que descreve o método que lançou a exceção. • Você deve alimentar essas propriedades quando lançar as exceções... ♦ Message: Texto informativo. ♦ HelpLink: Arquivo de ajuda. ♦ InnerException: Quando uma exceção é lançada dentro de um bloco catch, esta propriedade conterá uma referência ao objeto exceção que desviou o fluxo de execução para o bloco catch. 10. Criando exceções class MinhaAppException : ApplicationException { // campos que armazenam informações sobre // as exceções de nossa aplicação. public MinhaAppException() : base("Exceção em MinhaApp.") { } public MinhaAppException(string message) : base(message) { } public MinhaAppException(string message, Exception innerException) : base(message, innerException) { } // propriedades de leitura/escrita dos campos } 11. try... catch (global)  O que o runtime do .net faz quando uma exceção não é tratada? try { } catch { } 12. Blocos try aninhados try { // ponto A – o que ocorre se uma exceção é lançada neste ponto? try { // ponto B – e neste ponto? } assembly mensagem aborta execução Exceções - Aula 10 Página 76 catch { // ponto C } finally { // ponto D } } catch { // ponto E } finally { // ponto F } 13. C#  Dúvidas? Código não seguro - Aula 11 Página 77 1. Código não seguro 2. Keywords... [] abstract [] event [] new [] struct [] as [] explicit [] null [] switch [] base [] extern [] object [] this [] bool [] false [] operator [] throw [] break [] finally [] out [] true [] byte [] fixed [] override [] try [] case [] float [] params [] typeof [] catch [] for [] private [] uint [] char [] foreach [] protected [] ulong [] checked [] goto [] public [] unchecked [] class [] if [] readonly [] unsafe [] const [] implicit [] ref [] ushort [] continue [] in [] return [] using [] decimal [] int [] sbyte [] virtual [] default [] interface [] sealed [ ] volatile [] delegate [] internal [] short [] void [] do [] is [] sizeof [] while [] double [ ] lock [] stackalloc [] else [] long [] static [] enum [] namespace [] string 3. unsafe code  Útil para as seguintes situações... • Interfaceamento direto com o Sistema Operacional. • Acesso direto a dispositivos mapeados na memória... ♦ Quando o acesso ao dispositivo é feito através de um intervalo de memória RAM. ⇒ Exemplo: RAM de vídeo. • Implementação de algorítmos de tempo crítico.  O que vem pela frente... • Ponteiros. • Endereço de memória. • Estilo de programação C++... porém utilizando C#. 4. safe x unsafe  safe code... • Value types. • Reference types.  unsafe code... • Value types. • Reference types. • Pointer types. unsafe { int i; // value type object o; // reference type int* pi; // pointer type Código não seguro - Aula 11 Página 80 left = value; } } public unsafe Node* Right { get { return right; } set { right = value; } } } 10. Variáveis fixas e móveis  Variáveis fixas são aquelas armazenadas em locais da memória que não sofrem a ação do Garbage Collector... • Variáveis locais do tipo valor. • O operador & (address of) permite obtermos o endereço de uma váriavel do tipo fixa.  Variáveis móveis são aquelas que sofrem a ação do Garbage Collector... • Campos de classe. • O operador & (address of) só permite obtermos o endereço de um campo móvel dentro de um contexto fixo (fixed). class Program { static int i = 10; static void Main(string[] args) { int j = 0; unsafe { fixed (int* p1 = &i) { ... } int* p2 = &j; } } } 11. Exemplo static void Main(string[] args) { double d = 123.456; unsafe { byte* p = (byte*)&d; for (int i = 0; i < sizeof(double); i++) { Console.Write("{0:X2} ", *p++); } Console.WriteLine(); Console.ReadLine(); } } Código não seguro - Aula 11 Página 81 12. Acesso a membro via ponteiro public struct Point { int x, y; public int X { get { return x; } set { x = value; } } public int Y { get { return y; } set { y = value; } } } static void Main(string[] args) { Point point; unsafe { Point* p = &point; p->X = 1; // (*p).X = 1; p->Y = 2; // (*p).Y = 2; } Console.WriteLine(point.X); Console.WriteLine(point.Y); } 13. Otimizando o desempenho com ponteiros  Arrays na pilha de “alto desempenho e baixo overhead”... baixo overhead por não necessitar de alocação no heap. // Sequência de Fibonacci unsafe { int* fibonacci = stackalloc int[25]; int* p = fibonacci; *p++ = *p++ = 1; for (int i = 2; i < 25; i++, p++) { *p = p[-1] + p[-2]; } for (int i = 0; i < 25; i++) { Console.WriteLine(fibonacci[i]); } } Código não seguro - Aula 11 Página 82 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368 e 75025. 14. C#  Dúvidas? Threads - Aula 12 Página 85 T2 Highest: 6 T2 Highest: 7 T2 Highest: 8 T2 Highest: 9 T2 Highest: 10 T2 Highest: 11 T2 Highest: 12 T2 Highest: 13 T2 Highest: 14 T2 Highest: 15 T2 Highest: 16 T2 Highest: 17 T2 Highest: 18 T2 Highest: 19 T1 Lowest: 1 T1 Lowest: 2 T1 Lowest: 3 T1 Lowest: 4 T1 Lowest: 5 T1 Lowest: 6 T1 Lowest: 7 T1 Lowest: 8 T1 Lowest: 9 T1 Lowest: 10 T1 Lowest: 11 T1 Lowest: 12 T1 Lowest: 13 T1 Lowest: 14 T1 Lowest: 15 T1 Lowest: 16 T1 Lowest: 17 T1 Lowest: 18 T1 Lowest: 19 7. Sincronização class Numero { decimal valor; public decimal Valor { get { return valor; } } public void Inc() { valor++; } } 8. Sincronização (o problema) class Program { static Numero numero; static void Main(string[] args) { numero = new Numero(); Threads - Aula 12 Página 86 Thread t1 = new Thread(new ThreadStart(T1)); Thread t2 = new Thread(new ThreadStart(T2)); t1.Start(); t2.Start(); Console.ReadLine(); Console.WriteLine(numero.Valor); } static void T1() { for (int i = 0; i < 1000000; i++) { numero.Inc(); } Console.WriteLine("T1 terminou."); } static void T2() { for (int i = 0; i < 1000000; i++) { numero.Inc(); } Console.WriteLine("T2 terminou."); } } 9. Sincronização (Monitor) class Numero { decimal valor; public decimal Valor { get { return valor; } } public void Inc() { Monitor.Enter(this); valor++; Monitor.Exit(this); } } 10. Sincronização (lock) class Numero { decimal valor; public decimal Valor { get { return valor; } } public void Inc() Threads - Aula 12 Página 87 { lock (this) { valor++; } } } 11. Join class Program { static int result; static void Main(string[] args) { result = 0; Thread t = new Thread(new ThreadStart(Thread2)); t.Start(); t.Join(); // espera até que "t" termine. Console.WriteLine(result); } static void Thread2() { result = 123; } } 12. volatile class Program { static int result; static volatile bool finished; static void Main(string[] args) { result = 0; finished = false; Thread t = new Thread(new ThreadStart(Thread2)); t.Start(); while (!finished) ; Console.WriteLine(result); } static void Thread2() { result = 123; // o compilador, runtime, hardware finished = true; // pode inverter estas instruções para otimizar } } 13. Deadlock Thread 1 lock (a) { ... lock (b) { ... } C# 2.0 - Aula 13 Página 90 StoreString store = new StoreString(3); store[0] = "a"; store[1] = "b"; store[2] = "c"; Console.WriteLine(store[0]); Console.WriteLine(store[1]); Console.WriteLine(store[2]); 4. StoreInt x StoreString public class StoreInt { int[] items; public StoreInt(int count) { items = new int[count]; } public int this[int index] { get { return items[index]; } set { items[index] = value; } } } public class StoreString { string[] items; public StoreString(int count) { items = new string[count]; } public string this[int index] { get { return items[index]; } set { items[index] = value; } } } 5. StoreAll public class StoreAll { object[] items; public StoreAll(int count) { items = new object[count]; C# 2.0 - Aula 13 Página 91 } public object this[int index] { get { return items[index]; } set { items[index] = value; } } } 6. StoreAll (Problemas) // StoreAll será utilizada com o propósito // de armazenar números. StoreAll store = new StoreAll(3); store[0] = 10; store[1] = "b"; // compile-time type checking (impossível) store[2] = 30; Console.WriteLine( (int)store[0] + // casting dos dados é requerido (int)store[2] // performance penalty ); 7. StoreAll (versão utilizando generics) public class StoreAll<T> { T[] items; public StoreAll(int count) { items = new T[count]; } public T this[int index] { get { return items[index]; } set { items[index] = value; } } } // StoreAll será utilizada com o propósito // de armazenar números. StoreAll<int> store = new StoreAll<int>(3); store[0] = 10; store[1] = "b"; // erro: compile-time type checking store[2] = 30; // casting dos dados não é requerido. // não há perda de performance. Console.WriteLine( store[0] + store[2] ); C# 2.0 - Aula 13 Página 92 8. Generics  Classes, estruturas, interfaces, delegates e métodos podem ser parametrizados por tipos de dados que armazenam e/ou manipulam. • Vantagens... ♦ compile-time type checking. ♦ runtime casting desnecessário. StoreAll<int> store = new StoreAll<int>(3); store[0] = 10; store[1] = "b"; // erro: compile-time type checking store[2] = 30; // casting dos dados não é requerido. // não há perda de performance. Console.WriteLine( store[0] + store[2] ); 9. Generics  C# Generics é semelhante ao conceito de generics em... • Eiffel. • Ada. • C++ templates (mas sem as complicações dos templates em C++). 10. Estrutura de dados (object) public class Stack { object[] items; int count; public void Push(object item) { ... } public object Pop() { ... } } Stack stack = new Stack(); stack.Push("abc"); stack.Push(1); int number = (int)stack.Pop(); 11. Estrutura de dados (Generics) public class Stack<T> { T[] items; int count; public void Push(T item) { ... } public T Pop() C# 2.0 - Aula 13 Página 95 p.AddPontos(2); p.AddPontos(-7); } static void p_Zero(object sender, EventArgs e) { Console.WriteLine("Zero pontos."); } } 18. Anonymous methods  Permite que o código associado a um evento seja escrito in-line.  C# 2.0 suporta um recurso conhecido como “closures”. class Program { static void Main(string[] args) { Pontuacao p = new Pontuacao(5); p.Zero += delegate(object sender, EventArgs e) { Console.WriteLine("Zero pontos."); p.AddPontos(1); // Closures // p -> outer variable // tempo de vida de p? }; p.AddPontos(2); p.AddPontos(-7); } } 19. Numbers Numbers numbers = new Numbers(5, 3, 8, 2, 0, -1, 9, -2); foreach (int number in numbers) { Console.WriteLine(number); } 20. Numbers => IEnumerable public class Numbers : object, IEnumerable { int[] numbers; public Numbers(params int[] numbers) { this.numbers = numbers; } public int this[int index] { get { return numbers[index]; } set { numbers[index] = value; } } public int Length C# 2.0 - Aula 13 Página 96 { get { return numbers.Length; } } public IEnumerator GetEnumerator() { return new NumbersEnumerator(this); } } 21. Numbers => IEnumerator public class NumbersEnumerator : object, IEnumerator { Numbers numbers; int pos; public NumbersEnumerator(Numbers numbers) { this.numbers = numbers; this.pos = -1; } public object Current { get { if (pos > -1 && pos < numbers.Length) { return numbers[pos]; } else { throw new InvalidOperationException(); } } } public bool MoveNext() { if (pos >= numbers.Length) { return false; } else { pos++; return pos < numbers.Length; } } public void Reset() { pos = -1; } } 22. Iterator  Um iterador é um bloco que retorna “yield return” uma sequência de valores. C# 2.0 - Aula 13 Página 97 public class Numbers : object, IEnumerable { int[] numbers; public Numbers(params int[] numbers) { this.numbers = numbers; } public IEnumerator GetEnumerator() { foreach (int number in numbers) { yield return number; } } } 23. Partial types  Classes, estruturas e interfaces podem ser quebradas em diferentes unidades de compilação.  Aplicação... • Machine-generated code (geradores de código fonte) separado da implementação escrita pelo programador. public partial class Cliente : object { int id; string nome; string fone; } public partial class Cliente : object { public void DoSomething() { } }
Docsity logo



Copyright © 2024 Ladybird Srl - Via Leonardo da Vinci 16, 10126, Torino, Italy - VAT 10816460017 - All rights reserved