Sunteți pe pagina 1din 160

Programação Orientada a

Objetos com C# Básico


Tiago Moreira Totti
Tech Leader MIC PUCRS
Fabio Isquierdo
Developer MIC PUCRS
Conteúdo

 Módulo 1: Visão Geral da Plataforma .NET


 Módulo 2: Tipos de Dados
 Módulo 3: Classes e Objetos
 Módulo 4: Comandos e Operadores e coleções
 Módulo 5: Herança, Polimorfismo e Classes Abstratas
 Módulo 6: Aplicativos Console
 Módulo 7: Aplicativos Windows Forms
Visão Geral da Plataforma .Net

MÓDULO 1
C# - Uma nova linguagem
 Alternativa mais “limpa” ao C++
 Desenvolvido em conjunto com o .NET por
Anders Hejlsberg
 Atraente a desenvolvedores de outras
linguagens que não o VB (C/C++, Java, etc)
Por que uma nova linguagem?
 O “equilíbrio” que era bom nos anos 70/80 (C) e
80/90 (C++) não é bom hoje:
 ponteiros/malloc/free: é um mecanismo muito
frágil, especialmente para servidores de
aplicativos
 Não suportam componentes diretamente
 Fragilidade em ter vários arquivos (.CPP, .H, .LIB)

 Outras alternativas recentes apresentam sérios


problemas, principalmente de performance
C# - Baseado no C/C++
 Baseado no C++ quando possível:
 Declaração de variáveis
 Declaração de funções
 Blocos com { }
 Loops (for, while, do)
 Boa parte dos operadores (inclusive
+=, ++, ||, &&, !, !=, == etc)
C# - Diferenças do C++
 Apenas “managed code”; não suporta Win32
 Ponteiros apenas em código unsafe
 Tipos, biblioteca de runtime e demais
características do .NET Framework
 Não tem argumentos default, ou pré-
processador (#include)
 Ordem das declarações não é importante na
maioria dos casos
C# - Além do C++
 Linguagem orientada a componentes
 Tudo é visto como um objeto
 Robusta
C# - Além do C++ : componentes
 Propriedades, métodos e eventos como
conceitos de 1a categoria
 Permite declarar atributos explicitamente
 Documentação integrada em XML
 Sem .H, .LIB, .IDL; tudo é representado no
fonte
 Integração com ASP.NET
C# - Além do C++ : tudo é objeto

 Problemas tradicionais:
 C++, Java, Delphi: tipos primitivos são “mágicos” e
não-OOP
 Smalltalk, Lisp: tudo é objeto, mas custo de
performance é grande
 C# unifica os tipos sem custo de performance
 Coleções funcionam com todos os tipos
 struct e enum, além de inteiros, ponto flutuante
e decimal são tipos-valor (baratos)
C# - Além do C++ : robustez
 Coleta de lixo (Garbage Collector)
 Robustez e facilidade de uso
 Exceptions: mecanismo único de tratamento de
erros
 Tipos seguros: o sistema de tipos jamais pode
ser violado; todas as coerções são verificadas
 Considerações de versão feitas desde o início
(exemplo: atributos virtual, override, new)
C# - Compilação e execução

Compilação
Compilador Código (IL)
Código da Assembly
Fonte Metadados
Linguagem

Código Compilador
Nativo JIT

Execução
C# - Estrutura do programa
 Execução do programa começa no método Main()
 A palavra-chave using referencia namespaces da
Biblioteca de Classes do .NET Framework
 Instruções são comandos que executam ações
 Um programa é feito de muitas instruções
 Instruções são separadas por ponto-e-vírgula
 Chaves são usadas para agrupar instruções
using System;
class AloMundo {
static void Main() {
Console.WriteLine (“Alo, Mundo!”);
}
}
Laboratório

 Seguir o roteiro de laboratório 1


Tipos de Dados

MÓDULO 2
Sistema de tipos
 Tipos-valor
 Contém os dados diretamente
 Não podem ser “null”
 Tipos-referência
 Contém referências para objetos
 Podem ser “null”
int i = 123;
string s = "CTXML";

i 123

s "CTXML"
Sistema de tipos
 Tipos-valor

 Primitivos int i;
 Enumerações enum State { Off, On }
 Estruturas struct Point { int x, y; }

 Tipos-referência

 Classes class Foo: Bar, IFoo {...}


 Interfaces interface IFoo: IBar {...}
 Arrays string[] a = new string[10];
 Delegates delegate void Empty();
Sistema de tipos

Framework C#
Sistema de tipos
sbyte -128 a +127 8-bit com sinal
byte 0 a 255 8-bit sem sinal
short -32.768 a +32.767 16-bit com sinal
ushort 0 a 65535 16-bit sem sinal
int -2.147.483.648 a +2.147.483.647 32-bit com sinal
uint 0 a 4.294.967.295 32-bit sem sinal
-9.223.372.036.854.775.808 a
long 64-bit com sinal
+9.223.372.036.854.775.807
ulong 0 a 18.446.744.073.709.551.615 64-bit sem sinal
char U+0000 a U+ffff 16-bit Unicode
float 1,5x10-45 a 3,4x10+38 32-bit ponto flutuante
double 5,0x10-324 a 1,7x10+308 64-bit ponto flutuante
bool true ou false
decimal 1,0 × 10-28 a 7,9 × 10+28 128-bit ponto flutuante
Conversão de tipos
 Implícita
 Executada pelo compilador em operações em que há
garantia de que a informação não será truncada ou
perdida
int x = 123456; // 32 bits
long y = x; // coerção implícita para 64 bits

 Explícita
 Quando explicitamente é pedido ao compilador para
converter uma informação que pode ser perdida
int x = 65537; // 32 bits
byte z = (byte) x;
// coerção explícita para 8 bits
Conversão de Tipos

 System.Convert
 Mecanismo do framework para conversão
explícita de tipos.
 Convert.To<Tipo> (string valor)

string x = “123456”;
int y = Convert.ToInt(x); //conversão
//Explícita para Int
Conversão de Tipos
 TryParse
 Válido para todos os tipos valor

 Retorna um bool (sem exceptions)

 Facilidade para programar

bool <ClasseTipo>.TryParse(string entrada, <tipo> saida)

string x= “123456”;
int saida;
bool sucesso;
sucesso = Int32.TryParse(x,saida); //successo = true
//saida = 123456
X = “blahblah”
sucesso = Int32.TryParse(x,saida); //sucesso = false
//saida = 0
Declaração de variáveis
Declarando
1
 Atribuindo um tipo int numero;
2
 Atribuindo um nome
string palavra;
3
 Ponto-e-vírgula no final

Inicializando

1 Use operador de atribuição

2 Atribuindo um valor string s = ".net";


3 Ponto-e-vírgula no final
Atribuindo valores literais
1– Adicione um sufixo de tipo decimal val = 100M;
Declaração de constantes

 Declara-se utilizando a palavra-chave const


junto a um tipo
 O valor deve ser atribuído no ato da
declaração

const int raioTerrestre = 6378;//km

const long distanciaAoSol = 149600000;//km

const double velocidadeOrbital = 29.79D;//km sec


Strings
 Exemplo de string
string s = "Alo, Mundo"; // Alo, Mundo
 Declarando strings literais
string s = "\"Alo\""; // “Alo"
 Usando diretivas de caracteres
string s = "Alo\nMundo"; // nova linha adicionada
 Usando strings verbatim
string s = @"Alo\n"; // Alo\n
 Entendendo Unicode
O caracter “A” é representado por “U+0041”
Sistema de tipos
 Tudo pode ser visto como um objeto
 Todos tipos “herdam” de object

 Todos dados podem ser manipulados,

armazenados e transportados sem trabalho


adicional
object

Stream Hashtable int double

MemoryStream FileStream
Sistema de tipos
 Boxing
 Utilizar um tipo-valor de maneira consistente com um tipo-
referência
 Compilador aloca um objeto e copia valor
 Unboxing
 Obter o tipo-valor que sofreu a operação de boxing
 Verifica tipo e copia valor

int i = 123;
object o = i;
int j = (int)o;
i 123

o System.Int32

123
j 123
Enumerações
 Definindo enumerações
enum Planeta {
Mercurio,
Venus,
Terra,
Marte
}
 Usando enumerações
Planeta umPlaneta = Planeta.Marte;

 Mostrando variáveis
Console.WriteLine(“Planeta:“+umPlaneta);
Laboratório

 Seguir o roteiro de laboratório 2


Classes e Objetos

MÓDULO 3
O que é um programa ?
 Programa:
 Conjunto de objetos que se comunicam.

Purrer = ronronador
Pouncer = espreitador
Dog taunter = irritador de cachorro
Wool tangler = embaralhador de lâ
Exemplos

 Um programa e os objetos que o compõe ...


Objetos

 Objetos são as entidades que compõem um


programa.
 Cada objeto é responsável por executar
determinadas tarefas.
 O conjunto de tarefas que um objeto realiza
define seu comportamento.
Comportamento

 Objetos são manipulados através de seus


métodos.
 Um método consiste de uma seqüência de
instruções que acessam dados.
 Quando se executa um método não é
necessário conhecer seu conjunto de
instruções. O importante é saber a tarefa o
que o método realiza.
Representação de um objeto

Objeto 1 Identificador do objeto

Método 1
Método 2 Métodos
Método 3 (definem o comportamento do objeto)
Exemplo

 Um programa representa uma lâmpada.


Uma lâmpada pode estar ligada ou
desligada. Além disto, a lâmpada possui
um mecanismo que permite apagar a
lâmpada e um mecanismo que permite
acendê-la.
Programa da Lâmpada

Lampada

acende

apaga
Abstração
 Modelo  abstração
 Uma abstração foca nas características essenciais
de um objeto relativas a perspectiva do usuário.

•Por exemplo,
não foi o caso de
representar se a
lâmpada estava
queimada ou não.
Noção de estado

 A abstração da lâmpada implica em 2


estados:
 Aceso e apagado
 Um objeto é capaz de armazenar o estado
em que se encontra.
apaga

aceso apagado

acende
Classes e objetos

 Para representar várias lâmpadas são


necessários vários objetos:
Lampada Lampada Lampada

acende acende acende

apaga apaga apaga

 Todos estes objetos, porém, terão a mesma


estrutura, ou seja, pertencem a mesma classe.
Classes e objetos

veículos

Ferrari
Veículo objeto1
IDN8810
marca
placa instâncias
ler_placa Fiat Uno
IAS3333 objeto2
classe
Classes

 Uma classe é uma “fôrma” para produzir


objetos
 Determina um conjunto de objetos com:
 propriedades semelhantes
 comportamentos semelhantes
 relacionamentos comuns com outros objetos
Classes
 Membros das classes
 Constantes, atributos, métodos, propriedades,
indexadores, eventos, operadores, construtores,
destrutores
 Membros “de instância” e “de classe”
 Tipos aninhados

 Modificadores de Acesso
 public, protected, internal, private
Exemplo de classe completa
class Lampada {
private bool aceso; Atributo
public Lampada(){
aceso = false;
} Construtor

public void acende(){


aceso = true;
} Métodos
public void apaga(){
aceso = false;
}

public bool situacao(){


return (aceso);
}
}
Instanciando classes
Ativando métodos
...
Lampada l1 = new Lampada();
Lampada l2 = new Lampada(); Criação de instância
l1.acende();
l2.acende(); Ativação de métodos
l1.apaga();
if (l1.estaAcesa()) Console.WriteLine("Lampada 1 acesa");
else Console.WriteLine("Lampada 1 apagada");
if (l2.estaAcesa()) Console.WriteLine("Lampada 2 acesa");
else Console.WriteLine("Lampada 2 apagada");
...
Classes - Métodos
 Os parâmetros de um método podem receber um
modificador que indica a direção do fluxo de dados
 Entrada
 Saída
 Entrada/saída

Se não existe modificador, assume que é parâmetro de entrada


[nenhum] passado por valor.
Parâmetro de saída. Seu valor será atribuído pelo próprio método,
out não necessitando de inicialização prévia.
Parâmetro de entrada/saída. Seu valor pode ser atribuído antes da
ref chamada do método ou sofrer alteração pelo método.
Permite receber um número variável de parâmetros através de um
params array.
Classes - Métodos
 Parâmetro de saída
public void Adicionar(int x, int y, out int r) {…}
Adicionar(1, 2, out resultado);

 Parâmetro de entrada/saída
public void ParaMaiuscula(ref string s) {…}
ParaMaiuscula(ref frase);
 Parâmetros variáveis
public void MostrarLista(params int[] lista) {…}
int[] array = new int[3] {1,2,3};
MostrarLista(array);
MostrarLista(1,2,3);
MosttarLista(1,2,3,4,5);
Modificadores de acesso
 Modificadores de acesso são utilizados para
definir níveis de acesso a membros das classes
Declaração Definição
public Acesso ilimitado

private Acesso limitado à classe e seus membros

internal Acesso limitado ao programa (assembly)


Acesso limitado à classe, seus membros e
protected
a tipos derivados da mesma
protected Acesso limitado à classe, classes derivadas ou
internal membros deste programa (assembly)
Classes - Propriedades
 Propriedades são métodos que protegem o
acesso aos membros da classe
public string Nome {
get {
return nome;
}
set {
nome = value;
}
}

 Acessando propriedades
proximoCliente.Nome = "Microsoft";
Laboratório

 Seguir o roteiro de laboratório 3


Classes - Atributos
 Atributos constantes
 Definidos pela palavra-chave const
 Definido em tempo de compilação por um valor
literal
public const double pi = 3.1415;

 Atributos read-only
 Definidos pela palavra-chave readonly
 Definidos em tempo de execução através do
construtor
public readonly string pi;
Classes - Métodos
 Chama-se de sobrecarga de métodos
(overloading) o ato de criar diversos métodos
com o mesmo nome que se diferenciam pela
lista de argumentos (parâmetros)

 Métodos com mesmo nome, mas com tipo,


quantidade ou ordenação de parâmetros
diferentes, são considerados métodos diferentes
Classes - Construtores

 Construtores são métodos especiais que


implementam as ações necessárias para
inicializar um objeto
 Tem o mesmo nome da classe
 Não possuem tipo de retorno
 Podem possuir ou não parâmetros
public Cliente(string n, uint i) {
nome = n;
clienteID = i;
}
Classes - Construtores

 C# permite a inicialização dos membros no


contexto da própria declaração
 Se um construtor não é declarado, C# utiliza o
construtor padrão (sem parâmetros)
 Membros são inicializados por omissão com
valores padrão
 0 para valores numéricos
 null para tipos-referência
 false para booleano
Classes - Construtores
 Usualmente é útil para uma classe possuir mais
de um construtor a fim de oferecer diversas
maneiras para instanciar e inicializar os objetos
dessa classe
 Um construtor também pode sofrer o processo
de sobrecarga
public Cliente(string n, uint i) {

}
public Cliente(string n) : this(n, 0){

}
Laboratório

 Seguir o roteiro de laboratório 4


Comandos, Operadores e coleções

MÓDULO 4
Palavras Reservadas
Operadores
Operadores Comuns Exemplo
• Incremento/Decréscimo ++ --
• Aritmético * / % + -
• Deslocamento << >>
• Relacional < > <= >=
• Igualdade == !=
• Condicional && || ! ?:
• Null-Coalescing ??
• Lógico &|^
• Atribuição = *= /= %= += -=
<<= >>= &= ^= |=
If

 Baseados em expressões condicionais booleanas

if (x > 10)
{
if (y > 20)
Console.WriteLine(“Comando 1”);
}
else
Console.WriteLine(“Comando 2”);
Identidade X igualdade

 Identidade
 É uma propriedade da localização do objeto
 Testada pelo método System.Object.ReferenceEquals

 Igualdade
 É uma propriedade do valor do objeto
 Testada pelo método System.Object.Equals

 Cuidado!!!
 Semântica do operador == depende do tipo associado
Identidade X igualdade

 Exemplo
Object A, B, C, D;
A = "Uma string";
B = A;
C = "Uma string";
D = "Uma string diferente";

 A e B são idênticos e iguais


 A e C não são idênticos, mas são iguais
 A e D não são idênticos e não são iguais
Switch
 Funciona com valores inteiros e strings
switch(nota)
{
case “A”:
case “B”:
case “C”:
Console.WriteLine(“Aprovado”);
break;
case “D”:
case “E”:
Console.WriteLine(“Reprovado”);
break:
default:
Console.WriteLine(“Nota inválida”);
break;
}
While

 Executa um bloco de comandos enquanto


expressão é verdadeira

int n = 1;
while (n < 6)
{
Console.WriteLine(“Valor atual de n é {0}”, n);
n++;
}
Do

 Executa um bloco de comandos até que a


expressão se torne falsa

int n = 1;
do
{
Console.WriteLine(“Valor atual de n é {0}”, n);
n++;
}
while (n < 6);
For

 Executa um bloco de comandos um


determinado número de vezes

for( int n = 1; i < 6; n++)


{
Console.WriteLine(“Valor atual de n é {0}”, n);
}
Arrays
 Estrutura de dados que contém um número certo de
variáveis (elementos do array)
 Todos os elementos de um array tem que ser do mesmo
tipo
 Arrays são indexados a partir de zero
 Arrays são objetos
 Arrays podem ser:
 Unidimensionais, um array de ordem um
 Multidimensionais, um array de ordem maior do que um
 Jagged, um array cujos elementos são arrays
 Arrays possuem métodos específicos para manipulação
de seus itens
Arrays unidimensionais

 Declare um array adicionando um par de colchetes


logo a seguir do tipo de variável dos elementos
individuais
int[] MeuArrayDeInteiros;

 Instancie para criar


int[] MeuArrayDeInteiros = new int[5];
 Para criar um array do tipo Object
object[] MeuArrayDeObjects = new object[10];
Arrays unidimensionais
 Inicializando um array
int[] pedidos = {54, 76, 121, 812, 5, 16, 21, 23, 81, 93, 101};

 Acessando membros do array


Cliente[] clientes = {new Cliente(“Marcelo”), new Cliente(“Diego”)};

clientes[1]= new Cliente(“Rogério”);

Console.WriteLine(“{0} e {1}”,clientes[0].Nome,clientes[1].Nome);

//Escreve “Marcelo e Rogério” no console


Arrays multidimensionais
 É um array que usa vários índices para acessar seus elementos
 Utiliza várias coordenadas para especificar uma posição

int[,] arrayExemplo = {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}};

 Representação em memória:
Arrays jagged
 Arrays irregulares, onde cada linha pode ter um
tamanho diferente
 Cada elemento é um outro array
 Exemplo de declaração:
int[][] arrayExemplo;

 Exemplo de instanciação:
arrayExemplo = new int [2][];
arrayExemplo[0] = new int[3];
arrayExemplo[1] = new int[5];
ArrayLists

 ArrayLists não têm tamanho definido


 Use o método Add(object) para adicionar um
objeto ao fim da ArrayList
 Use [] para acessar elementos na ArrayList
 Localizados do namespace System.Collections
 Use Clear() para remover todos os elementos
 Uso recomendado para manipulação de
coleções de objetos
Lists

 System.Collections.Generic
 Mesma funcionalidade de ArrayList, mas é
typesafe (guardam um tipo pré-definido de
objetos)

 Sem necessidade de boxing e unboxing


 Uso adequado para tipos-referência
Lists

Object int Sem int


Generics
int
Object int
Com
Generics int
Object int

int Object int


int int
box unbox Add List<int>[i]

int int
Add List<int>[i]
Exemplos
 List<Tipo>
// Lista de inteiros
List<int> intList = new List<int>()

intList.Add(1); //Sem boxing


intList.Add(2);

intList.Add(“Três”); //Erro em tempo de


compilação

int i = intList[0] //Cast não


requerido
Foreach
 Varrer arrays
public static void Main(string[] args) {
foreach (string s in args) Console.WriteLine(s);
}

 Varrer coleções
foreach (Customer c in customers.OrderBy("name"))
{
if (c.Orders.Count != 0) {
...
}
}
Laboratório

 Seguir o roteiro de laboratório 5


 Seguir o roteiro de laboratório 5.5
Classes - Indexadores

 Indexador é um tipo especial de propriedade


cujo propósito é permitir o acesso a membros de
um objeto de forma parametrizada
 Permite acessar dados através da “notação de
array”

public int this[int indice] {


get {…}
set {…}
}
Classes - Atributos de classe
 Atributos de instância:
 Cada objeto possui uma cópia particular com seus valores
 Representam o estado de um objeto em particular
 Atributos de classe:
 Cada classe possui uma única cópia do atributo,
independente do número de objetos instanciados a partir
da classe
 Objetos compartilham os atributos de classe
 São declarados pela palavra-chave static
 Atributos constantes são de classe por padrão
 Invocação <nome_classe>.<nome_atributo>
Classes - Métodos de classe
 Métodos de instância:
 Fornecem o comportamento dos objetos instanciados
a partir de uma classe
 Trabalham sobre os atributos de um objeto dessa
classe
 Métodos de classe:
 Fornecem um comportamento que é independente da
existência de objetos de uma classe
 Pertencem à classe e são compartilhados por todas as
instâncias da classe
 Trabalham sobre os atributos de classe
 Indicados pela palavra-chave static
 Invocação
<nome_classe>.<nome_método>(<parâmetros>)
Laboratório

 Seguir o roteiro de laboratório 6


Herança, Polimorfismo e Classes Abstratas

MÓDULO 5
Herança
 Ao modelar um conjunto de classes, podemos
encontrar classes semelhantes na estrutura e no
comportamento
 Solução 1: modelar as classes de forma independente
duplicação de código
 Solução 2: extrair características estruturais e
comportamentais que sejam comuns e colocá-las em
classes mais gerais a partir das quais são definidas
classes mais específicas
herança
Herança

 Uma classe que admite casos particulares é


uma classe base.
 Uma classe que é uma particularização de
uma classe base é uma classe derivada
daquela classe base.
 Em um programa bem construído, todos os
conceitos expressos nos tipos de dados e
respectivos métodos de uma classe base
também fazem parte da classe derivada.
Herança

 Herança é uma relação de


generalização/especialização entre classes
 A idéia central de herança é que novas
classes são criadas a partir de classes já
existentes
 Classe derivada herda de uma classe base
 Classe derivada é mais específica que a classe
base
 Herança origina uma estrutura em árvore
Herança

 Por exemplo, poderíamos construir uma classe


(tipos de dados e métodos) para capturar os
conceitos relevantes relativos a telefones.
 Adotando essa classe como base, poderíamos
então construir as classes derivadas telefones
fixos e telefones móveis.
 Os telefones móveis poderiam gerar ainda as
classes derivadas telefones móveis pré-pagos e
telefones móveis pós-pagos.
Herança

Telefone

TelefoneFixo TelefoneMovel

TelefoneMovelPrePago TelefoneMovelPosPago
Herança

 Construímos dessa forma uma hierarquia de


classes.
 Existem conceitos e operações que só dizem
respeito aos telefones móveis pré-pagos, e
alguns conceitos e operações relativos a essa
categoria de telefones têm detalhes que são
inerentes a apenas tais telefones. Os telefones
móveis pré-pagos, entretanto, continuam sendo
telefones, e portanto a eles se aplicam os
conceitos referentes a telefones em geral.
Herança

 Para definir a herança de classes em C#


utiliza-se um “:” seguido do nome da classe
base
 C# suporta herança simples de classes

public class ClasseDerivada : ClasseBase {



}
Herança

 Ao definir os construtores de uma subclasse:


 O construtor deve obrigatoriamente chamar o
construtor da classe base para inicializar os atributos
herdados
 Caso um construtor não referencie o construtor da
classe base, C# automaticamente referencia o
construtor vazio da classe base
 Cuidado! Aqui pode acontecer um erro de compilação caso a
classe base não possua um construtor vazio
Herança

 O construtor da classe derivada pode referenciar


explicitamente um construtor da classe base via
a palavra-chave base após a assinatura do
construtor da subclasse e da marca “:”
public class ClasseBase {
public ClasseBase(int i){...}
}
public class ClasseDerivada : ClasseBase {
public ClasseDerivada(int j,double d) :
base(j){...}
}
Herança

 Uma classe pode ser impedida de ser


estendida via herança através da palavra-
chave sealed

public sealed class Classe {



}
Herança

 Uma classe derivada pode sobrescrever


métodos da classe base
 Sobrescrita permite completar ou modificar um
comportamento herdado
 Mecanismo básico do polimorfismo em
orientação a objetos
 Um mesmo método possui diferentes implementações
em diferentes classes de uma hierarquia
Herança

 Modificadores virtual e override:


 Um método de uma classe base que pode ser
sobrescrito em uma classe derivada deve ser
marcado com a palavra-chave virtual
 Um método da classe derivada que sobrescreve
um método herdado de uma classe base é
marcado pela palavra-chave override
 C# permite a sobrescrita tanto de métodos
quanto de propriedades
Herança

 Aplicando a sobrescrita de métodos:

public class Object {


public virtual string ToString(){...}
}

public class ClasseDerivada : Object {


public override string ToString(){...}
}
Herança

 Algumas regras ao utilizar virtual e override:


 Você não pode aplicar os modificadores a um método
privado
 Os dois métodos devem ser idênticos, isto é, eles
devem ter o mesmo nome, os mesmos tipos de
parâmetros e o mesmo tipo de retorno
 Os dois método devem ter a mesma permissão de
acesso
 Você somente pode sobrescrever métodos virtuais
 Métodos marcados com override são implicitamente
virtual e podem ser sobrescritos posteriormente
Herança

 O método herdado original, que foi


posteriormente sobrescrito, pode ser
referenciado através da construção
base.nome_método
public override void Metodo(){
base.Metodo();
}

 Um método pode ser impedido de ser


sobrescrito através da palavra-chave sealed
public sealed override void Metodo(){...}
Laboratório

 Seguir o roteiro de laboratório 7


Polimorfismo

 Polimorfismo é a capacidade de assumir


formas diferentes
 C# permite a utilização de variáveis
polimórficas
 Uma mesma variável permite referência a objetos
de tipos diferentes
 Os tipos permitidos são de uma determinada
classe e todas as suas classes derivadas
Polimorfismo
 A uma referência do tipo da classe base pode ser
atribuída uma referência da própria classe base
ou de qualquer uma de suas classes derivadas na
hierarquia
 Entretanto há uma limitação significativa, somente
poderemos acessar os membros públicos definidos
pelo tipo da variável
public class ClasseBase : ClasseDerivada {

}

ClasseBase obj;
obj = new ClasseDerivada();
Polimorfismo

 Em C# podemos utilizar métodos


polimórficos
 Significa que uma mesma operação pode ser
definida em diversas classes, cada uma
implementando a operação de uma maneira
própria
 Utiliza como base a sobrescrita de métodos
 Os métodos virtuais permitem chamar diferentes
versões do mesmo método, com base no tipo de objeto
determinado dinamicamente em tempo de execução
Polimorfismo
 Exemplo:
class Mamifero {
public virtual string GetTipo(){
return "Mamífero";
}
}
class Cachorro : Mamifero {
public override string GetTipo(){
return "Cachorro";
}
}

Mamifero m1 = new Mamifero();


Cachorro c = new Cachorro();
Mamifero m2 = new Cachorro();
Console.WriteLine(m1.GetTipo()); “Mamífero”
Console.WriteLine(c.GetTipo()); “Cachorro”
Console.WriteLine(m2.GetTipo()); “Cachorro”
Polimorfismo x Herança

 Uma classe derivada pode ocultar um método


herdado da classe básica
 Se uma classe base e uma classe derivada declararem
dois métodos iguais, ocorrerá uma mensagem de
aviso do compilador
 Ocultar um método é um meio de substituir um
método por outro
 Para ocultar um método, utilizamos o modificador
new
 Com o modificador, o compilador não emite um aviso
Herança

 Ocultando um método:

public class ClasseBase {


public void Metodo(){...}
}

public class ClasseDerivada : ClasseBase {


new public void Metodo(){...}
}
Classes Abstratas

 Em uma hierarquia de classe, quanto mais


alta a classe, mais abstrata é sua definição
 Uma classe no topo da hierarquia define apenas o
comportamento e atributos que são comuns a
todas as classes
 Em alguns casos, a classe nem precisa ser
instanciada diretamente e cumpre apenas o papel
de ser um repositório de comportamentos e
atributos em comum
Classes Abstratas

 Uma classe abstrata é uma classe construída


exclusivamente para ser particularizada, ou
seja para funcionar como uma “matriz” de
conceitos específicos que de fato sejam
utilizados diretamente em um programa
 Uma classe abstrata, portanto, não admite
instâncias – somente suas classes derivadas
admitem instâncias
Classes Abstratas

 É possível definir classes, métodos e


propriedades abstratas em C#
 Utiliza-se a palavra-chave abstract
 Método e propriedades abstratos não possuem
código de implementação
public abstract class ClasseAbstrata{
public abstract void MetodoAbstrato();
public abstract object PropriedadeAbstrata{
get;
set;
}
public void metodoConcreto(){...}
}
Classes Abstratas

 Uma classe concreta que herda de uma classe


abstrata deve implementar todos os métodos
abstratos herdados!
public class ClasseConcreta : ClasseAbstrata{
public void MetodoAbstrato(){...}
public object PropriedadeAbstrata{
get{...};
set{...};
}
}
Operadores is e as
 O operador is verifica se um objeto é compatível
com um determinado tipo, e o resultado da
avaliação é um booleano
 Este operador nunca lança uma exceção
Object obj = new Object();
Boolean b1 = (obj is Object); // b1 é true
Boolean b2 = (obj is Classe); // b2 é false

if (obj is MinhaClasse) {
MinhaClasse meuObjeto = (MinhaClasse)obj;
// utilizar o objeto convertido
}
Operadores is e as

 O operador as realiza a conversão de objetos


sem levantar exceções
 Caso a conversão não seja possível, o
operador retorna null

MinhaClasse meuObjeto = obj as MinhaClasse;


if (meuObjeto != null) {
// utilizar o objeto convertido
}
Laboratório

 Seguir o roteiro de laboratório 8


Aplicativos de Console

MÓDULO 6
Aplicativos C#
 Qualquer programa aplicativo em C# começa
sua execução pelo método Main()
 Deve existir em uma única classe do assembly

 Possíveis assinaturas:
public static void Main(String[] args){…}
public static void Main(){…}
public static int Main(){…}
Aplicativos Console

 Não utilizam o ambiente gráfico - janelas,


botões, menus – tornando mais rápida a sua
execução

 O aplicativo é executado em uma janela de


prompt de comando, e sua interação é feita de
um modo simples
System.Console

 A classe Console, definida no namespace


System, encapsula a manipulação dos streams
de input, output e error em aplicações console
Métodos Descrição
Read() Lê o próximo carácter da entrada padrão.
ReadLine() Lê a próxima linha de caracteres do entrada padrão.
Write() Escreve a informação passada como parâmetro na saída padrão.
Escreve a informação passada como parâmetro, seguida de terminação de linha,
WriteLine()
na saída padrão.
Método Console.Write()

 É o método utilizado pelas aplicações console


para exibirem caracteres na tela
 Chama implicitamente o método ToString()

static void Main(string[] args)


{
Console.Write("Texto exibido pelo método Console.Write");
}
Formatação de strings

 A linguagem C# permite realizar diversas


configurações e formatação de estilos antes de
exibir resultados ao usuário

static void Main(string[] args)


{
Console.WriteLine(“Format. de Ponto-fixo: {0:F2}”, 12.76859);
}
Formatação de strings
 Formato <N>,<M>:<C>
 <N> número do argumento
 <M> número mínimo de caracteres do argumento, com
preenchimento “ “; número negativo indica preenchimento à
esquerda e positivo à direita
 <C> código de formatação
C ou c Formatar valor monetário.
Formatar número decimal. Permite especificar o número de dígitos para
D ou d
preenchimento.
E ou e Formatar notação exponencial.
F ou f Formatar número em ponto fixo.
G ou g Formatar número. Suporte a ponto fixo ou exponencial.
N ou n Formatar números de forma básica.
Formatação de strings
Especificador Tipo Formato Saída (double 1.42) Saída (int 12400)

c Currency {0:c} $1.42 $12,400

d Decimal {0:d} System.FormatException 12400

e Exponencial {0:e} 1.420000e+000 1.240000e+004

f Ponto Fixo {0:f} 1.42 12400.00

g Geral {0:g} 1.42 12400

n Número com vírgulas {0:n} 1.42 12,400


para milhares

r Round trippable {0:r} 1.42 System.FormatException

x Hexadecimal {0:x4} System.FormatException Cf90


Formatação de strings
Especificador Tipo Exemplo Saída (double 1500.42)

0 Zero {0:00.0000} 1500.4200

# Dígito {0:(#).##} (1500).42

. Ponto decimal {0:0.0} 1500.4

, Separador de milhares {0:0,0} 1,500

,. Escala numérica {0:0,.} 2

% Porcento {0:0%} 150042%

e Expoente {0:00e+0} 15e+2


Formatação de strings
Especificador Tipo Exemplo Exemplo de saída
dd Dia {0:dd} 10
ddd Nome do dia {0:ddd} Tue
dddd Nome completo do dia {0:dddd} Tuesday
hh Hora com 2 dígitos {0:hh} 10
HH Hora com 2 dígitos no formato 24h {0:HH} 22
mm Minuto 00-59 {0:mm} 38
MM Mês 01-12 {0:MM} 12
MMM Abreviação do mês {0:MMM} Dec
MMMM Nome completo do mês {0:MMMM} December
ss Segundos 00-59 {0:ss} 46
tt AM ou PM {0:tt} PM
yy Ano com 2 dígitos {0:yy} 02
yyyy Ano {0:yyyy} 2002
: Separador {0:hh:mm:ss} 10:43:20
/ Separador {0:dd/mm/yyyy} 10/12/2002
Formatação de strings

 Pode-se formatar strings também através do


método String.Format()

Exemplo Gera
String.Format("->{1,10}<-", "Hello"); -> Hello<-

String.Format("->{1,-10}<-", "Hello"); ->Hello <-


Laboratório

 Seguir o roteiro de laboratório 9


Aplicativos Windows Forms

MÓDULO 7
Aplicativos Windows

 Aplicativos Windows utilizam os formulários para


interação com o usuário
 Classes disponíveis no namespace
System.Windows.Forms
 Os Formulários (Windows Forms) têm a função
de hospedar controles
 Esses controles – botões, menus, caixas de texto,
etc – proporcionam uma interface mais
“amigável” com o usuário
Aplicativos Windows
 Um aplicativo Windows
possui três componentes
principais:
 aplicação
 formulários da aplicação Label
 controles no formulário
“Hell…”

Application MeuForm
label1 Button
mainForm
button1 “OK”
Classe Application

 Representa a própria aplicação


 Não possui instâncias (todas propriedades e métodos
são static)
 Controla a execução das janelas
 Processa eventos dos controles
 Run, DoEvents

class Program {
public static void Main() {
Form1 form = new Form1();
System.Windows.Forms.Application.Run(form);
}
}
Classe Form

 Representa a(s) janela(s) da aplicação


 Provê serviços básicos sobre janelas
 propriedades: Text, Size, Location, Controls
 metodos: Show, ShowDialog, Close
 eventos: Load, Click, Closing
 Formulários criados pelo usuário são derivados dessa
classe
partial class Form1 : Form {
public Form1() {
this.Text = "This is my form!";
this.Location = new Point(10, 10);
this.Size = new Size(100, 100);
}
}
Classe Form

 Dois métodos para abrir uma janela


secundária em uma aplicação:
 Show – para janelas não-modais
 ShowDialog – para janelas modais
 Uma janela modal é aquela utilizada em diálogos, onde
não é possível acessar outras janelas enquanto ela não
for fechada
Controles
 Controles são componentes visuais
 System.Windows.Forms.Control é a classe básica de diversos
controles
 Button, Label, TextBox, ListBox, etc.
 Estão contidos dentro de uma janela em uma coleção especial
 Coleção Controls
public class MyForm : Form
{
private Button button1;

public MyForm()
{
button1 = new Button();
button1.Text = "Click Me!";
button1.Location = new Point(10, 10);
this.Controls.Add(button1);
}
}
Controles

 Propriedades importantes:
 Anchor
 Define uma distância constante entre o controle e uma
ou mais bordas do componente onde ele está contido
 Valores Top, Bottom, Left, Right, None
 Dock
 Permite “amarrar” o controle a uma ou mais bordas do
componente onde ele está contido
 Valores Top, Bottom, Left, Right, Fill, None
Demonstração

 Abra o projeto Exemplo2


Eventos
 São ações sofridas pelos controles, como por
exemplo clicar um botão
 Esse evento é chamado de Click
 Quando ocorre um tipo de evento, é
executado o código anexado a ele
private void button1_Click(object sender, System.EventArgs e) {
MessageBox.Show("O evento Click do botão foi disparado!");
}
Eventos - Exemplos
 Button
 Click: Ao clicar no botão
 Mouse Down: Ao clicar uma vez no botão com o
mouse
 TextBox
 Enter: Ao receber o foco
 TextChanged: Ao alterar o texto
 ListBox
 SelectedIndexChanged: Ao selecionar um item
Exercícios

 Seguir o roteiro de laboratório 10


 Seguir o roteiro de laboratório 11
ListBox

 Permite a seleção de um ou vários elementos de


uma lista
 Dados armazenados na coleção Items
 Qualquer tipo de objetos
 Usualmente strings
 Opções para configurar os dados:
 Propriedade DataSource com a fonte de dados
 Adição direta na coleção de itens via método Add()
 Remoção direta da coleção de itens via método
Remove() e RemoveAt()
ListBox
 Para configurar o modo de seleção:
 Propriedade SelectionMode
 One para um único valor
 MultiSimple para múltiplos valores
 MultiExtended para múltiplos valores com suporte às teclas shift e ctrl
 Para obter a seleção do usuário:
 Propriedades SelectedIndex ou SelectedIndices para obter o índice
dos elementos selecionados
 Cuidado! O índice do primeiro elemento é 0
 Propriedades SelectedItem ou SelectedItems para obter o valor
dos elementos selecionados
 Propriedade SelectedValue para obter o valor associado ao
elemento selecionado
 Cuidado! Deve ser configurado via a propriedade ValueMember
ListBox

 Para configurar os dados visíveis/retornados


em objetos com DataSource:
 Propriedade ValueMember especifica o nome do
valor do elemento da fonte de dados
 Propriedade DisplayMember especifica o nome do
dado “visual” do elemento da fonte de dados
ComboBox

 Semelhante ao ListBox
 Para configurar o comportamento:
 Propriedade DropDownSyle
 Simple semelhante ao ListBox
 DropDown permite a seleção e digitação de um valor
 DropDownList permite a seleção mas não permite a
digitação de um valor
Demonstração

 Abra o projeto Exemplo3


CheckBox

 Permite indicar um elemento com a


informação de aceitação/rejeição
 Para obter a seleção do usuário:
 Propriedade Checked retorna true ou false
dependendo se o item está marcado ou não
RadioButton

 Permite a seleção de um único elemento


dentre várias opções
 O grupo de botões deve estar dentro de um
GroupBox para que a seleção seja exclusiva
 Para obter a seleção do usuário:
 Propriedade Checked retorna true ou false
dependendo se o item está marcado ou não
Demonstração

 Abra o projeto Exemplo4


Componentes Acesso a Dados

 Fontes de dados
 Representam os dados disponíveis para um
aplicativo
 Camada de acesso a dados com base na API ADO.NET
 Configuração via Data Source Configuration
Wizard
 Cria automaticamente o conjunto de classes necessárias
para acesso aos dados
 Três tipos diferentes de fontes
 Banco de dados
 Objetos com propriedades públicas
 Web services
Componentes Acesso a Dados

 Objetos do ADO.NET utilizados:


 Connection
 Provê conectividade a uma fonte de dados
 Command
 Acesso a comandos para consulta, alteração, inserção de dados e
execução de stored procedures
 DataReader
 Provê um fluxo de dados de leitura de alta performance
 DataAdapter
 Provê uma ponte entre um DataSet e uma fonte de dados
 DataSet
 Representa dados relacionais em memória
Objeto DataSet
DataSet
 DataSets armazenam dados de
Tables forma semelhante a um modelo
Table de banco de dados relacional
 São constituídos de coleções de
Columns
tabelas (Tables) e
Column relacionamentos (Relations)
 Tabelas (Tables) contém
Constraints
coleções de colunas (Columns),
Constraint restrições (Constraints) and
Rows
registros (Rows)
Row
Relations
Relation Object Collection
Componentes Acesso a Dados
Componentes Acesso a Dados
Componentes Acesso a Dados

 DataSet tipado
 É uma subclasse de DataSet que incorpora as
definições de esquema (tabelas e colunas) através
de propriedades públicas
 Subclasse é criada através das informações de
esquema XML contidas em um XSD (XML Schema
Definition)
 Pode ser criado automaticamente pelo Visual
Studio
 Ao criar uma fonte de dados a partir de um banco de
dados, é criado um DataSet tipado automaticamente
Componentes Acesso a Dados
Componentes Acesso a Dados

 TableAdapter
 São objetos criados pelo Visual Studio que podem
ser entendidos como uma versão tipada do
DataAdapter
 Permite
 Executar comandos em um banco de dados
 Preencher com dados um DataTable/DataSet
 Método Fill(), método GetData()
 Atualizar o banco de dados associado com as alterações
feitas em um DataTable
Componentes Acesso a Dados
Componentes Acesso a Dados
Componentes Acesso a Dados
Componentes Acesso a Dados
 Exemplo de conjunto de classes criadas (tabela “Shippers” do
“Northwind”):
 Uma classe derivada de DataSet

 ShippersDataSet
 Uma classe derivada de DataTable
 ShippersDataTable
 Uma classe derivada de DataRow
 ShippersRow
 Um TableAdapter
 ShippersTableAdapter
 Uma classe derivada de EventArgs
 ShippersRowChangeEvent
 Um delegate
 ShippersRowChangeEventHandler
Exercícios

 Seguir o roteiro de laboratório 12


Vinculação

 Data Binding
 É chamado de vinculação de dados
 Entende-se como a associação de uma fonte de dados com
um componente visual de interface gráfica
 Dois tipos de vinculação:
 Simples – permite que se anexe uma propriedade de um
controle/formulário a um único valor na fonte de dados
 TextBox, Label, etc
 Complexa – permite anexar um controle a uma lista de valores
 ListBox, ComboBox, etc
Exercícios

 Seguir o roteiro de laboratório 13


 Dúvidas e/ou sugestões
© 2008 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered trademarks and/or trademarks in the U.S. and/or other countries.
The information herein is for informational purposes only and represents the current view of Microsoft Corporation as of the date of this presentation. Because Microsoft must respond to changing market
conditions, it should not be interpreted to be a commitment on the part of Microsoft, and Microsoft cannot guarantee the accuracy of any information provided after the date of this presentation.
MICROSOFT MAKES NO WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, AS TO THE INFORMATION IN THIS PRESENTATION.

S-ar putea să vă placă și