Anda di halaman 1dari 333

Curso de C#

PR-INFORMTICA
QUALIFICAO PROFISSIONAL
Curso C#
Orientaes Gerais
Horrio da Aula
19:00 as 22:30
Banheiros e gua
2 Andar
Intervalo
10 Minutos
Recursos
Outras Orientaes
Introduo
O curso proposto resultado da experincia da Pr-
Informtica em ministrar treinamentos para capacitao
na rea de TI ao longo dos seus 25 anos.

O objetivo principal do curso ensinar tcnicas para
resoluo de problemas e conseqentemente
automatizao de tarefas.


a nica coisa constante no mundo a mudana

Objetivos e publico alvo
Capacitar o participante a desenvolver programas
utilizando a ferramenta C#.

Pblico Alvo: Profissionais e estudantes da rea de
TI

Agenda


Viso geral de C#
Utilizando variveis do tipo valor
Comandos e excees
Mtodos e parmetros
Matrizes (vetores)
Fundamentos da programao orientada a objetos
Utilizando variveis do tipo referncia
Criando e destruindo objetos
Herana em C#
Agregao, namespace e escopo avanado
Operadores, delegaes e eventos
Propriedades e indexeradores
Atributos





Viso geral de C#
Objetivos
Entender a estrutura bsica de um
programa simples escrito em C#
Utilizar a classe Console para operaes
bsicas de entrada / sada
Gerar a documentao em XML de um
programa escrito em C#
Compilar e executar um programa
escrito em C#
Depurar um programa escrito em C#
Principais Caractersticas
Case sensitive: diferencia maisculas de
minsculas
Fortemente tipada: todas as variveis
devem ser declaradas
Orientada a objetos: tudo um objeto
no .NET Framework
Geralmente as linhas so terminadas
com ;
O mtodo Main
Hello World
using System;
class Hello
{
public static void Main( )
{
Console.WriteLine( Hello World );
}
}
Classe Console
Console.Write:
Console.Write( TouchAndThink.NET );
Console.WriteLine:
Console.WriteLine( TouchAndThink.NET );
Console.Read:
char letra = Console.Read( );
Console.ReadLine:
string linha = Console.ReadLine( );
Exerccio



Vamos utilizar o Microsoft Visual Studio 2005
para desenvolver o programa Hello World
Tipos de Comentrios
Comentando uma nica linha
//

Comentrio vrias linhas
/* ... */

Documentao XML
///
Documentao XML
using System;

/// <summary>
/// Este meu primeiro programa em C#
/// </summary>
class Hello
{
/// <remarks>
/// Utilizando o motdo WriteLine da classe Console
/// <seealso cref="System.Console.WriteLine"/>
/// </remarks>
public static void Main( )
{
Console.WriteLine( "Hello World" );
}
}
Tags Documentao XML
<summary>...</summary>
Breve descrio

<remarks>...</remarks>
Descrio detalhada

<seealso cref>...</ seealso>
Indica uma referncia para outro membro ou campo

Documentao completa em:
http://msdn.microsoft.com/library/default.asp?url=/library/en
-us/csref/html/vclrftagsfordocumentationcomments.asp
Gerando Documentao
XML
Atravs do Visual Studio:
->Menu Project
-> Properties
-> Build
->XML Documentation File

Atravs da janela de comando:
csc meuprograma.cs /doc:meuxml.xml

Exerccio



Gerando a documentao XML de um programa
escrito em C#
Compilando
Atravs do Microsoft Visual Studio:
->Menu Build
-> Build Solution


Atravs da janela de comando:
csc /out:meuprograma.exe meuprograma.cs

Executando
Atravs do Microsoft Visual Studio:
-> Menu Debug
-> Start Without Debugging (CTRL+F5)


Atravs da janela de comando:
Digite o nome da aplicao (.EXE)


Depurando
Configurando breakpoints
Right Click na linha -> Insert BreakPoint
Execute um clique na margem esquerda

Executando passo-a-passo
->Menu Build
->Start (F5)

Examinando e modificando variveis
Atravs da janelas Autos e Wacth
Exerccio



Compilar, executar e depurar um programa
escrito em C#
Ferramentas SDK
CORDBG.EXE (Runtime Debugger)
Depurador de linha de comando

ILASM.EXE (MSIL Assembler)
Pega a MSIL e gera o executvel

ILDASM.EXE (MSIL Disassembler)
Gera MSIL a partir de cdigo executvel

Lista completa de utilitrios em:
http://msdn.microsoft.com/library/default.asp?url=/libr
ary/en-us/cptools/html/cpconNETFrameworkTools.asp
Demonstrao



Utilizando o utilitrio de linha de comando
ILDASM para verificar cdigo MSIL






Utilizando variveis do
tipo valor
Objetivos
Entender os tipos de dados do C#
Nomear variveis
Declarar variveis
Atribuir valor variveis
Criar seus prprios tipos de dados
Converso entre tipos de dados
Commom Type System
Parte do CLR (Commom Language RunTime)

Compartilhado entre todas as
linguagens .NET

Tipos de variveis:
Value types
Reference types
Value Types
Existem dois tipos de value types

Built-in types (Simple types)
int
float

User defined types
enum
struct
Simple Types
Identificados atravs de palavras
reservadas

Essas palavras reservadas so na
verdade apelidos para estruturas pr-
definidas

Exemplo:
int // palavra reservada
System.Int32 // struct type
Simple Types
Palavra reservada Estrutura Valores Permitidos
sbyte System.SByte
Inteiros entre -128 e 127
byte System.Byte
Inteiros entre 0 e 255
short System.Int16
Inteiros entre -32768 e 32767
ushort System.UInt16
Inteiros entre 0 e 65535
int System.Int32
Inteiros entre -2137483648 e 2147483647
uint System.UInt32
Inteiros entre 0 e 4294967295
long System.Int64
Inteiros entre -9223372036854775808 e
9223372036854775807
ulong System.UInt64
Inteiros entre 0 e 18446744073709551615
float System.Single
1,5x10^-45 at 3,4x10^38
double System.Double
5,0x10^-324 at 1,7x10^308
decimal System.Decimal
1,0x10^-28 at 7,9x10^28
bool System.Boolean
Valor booleano, verdadeiro ou falso
char System.Char
Caracteres single unicode
string System.String
Sequncia de caracteres
Nomeando variveis
Regras:
Iniciar com caracter ou underscore
Depois do primeiro caracter, utilize caracteres e/ou
dgitos
No utilizar palavras reservadas

Recomendaes:
Evitar utilizar todas as letras maisculas
Evitar iniciar com underscore
Evitar utilizar abreviaes
Utilizar PascalCasing para variveis de mltiplos
nomes
Palavras reservadas em C#
abstract as base bool break
byte case catch char checked
class const continue decimal default
delegate do double else enum
event explicit extern false finally
fixed float for foreach goto
if implicit in int interface
internal is lock long namespace
new null object operator out
override params private protected public
readonly ref return sbyte sealed
short sizeof stacklloc static string
struct switch this throw true
try typeof uint ulong unchecked
unsafe ushort using virtual void
volatile while
Declarando Variveis
Locais
Identificar o tipo e o nome da varivel:

int num1;

Voc pode declarar mltiplas variveis
em uma mesma linha:

int num1, num2, num3;
Atribuindo Valores
Variveis
Atribua valores variveis atravs do
operador =

int num1; // Declarando a varivel
num1 = 0; // Atribuindo valor

OU

int num1 = 0; // Declarando a varivel e j
inicializando a mesma
Shortland
Ao invs de escrever:
int num1 = 0;
num1 = num1 + 4;

Escreva:
int num1 = 0;
num1 += 4;

Isso funciona com todos os operadores
aritmticos
Operadores
Operador Exemplo
Comparao == !=
Relacionais < > <= >= is
Condicionais && || ?:
Incremento ++
Decremento --
Aritimtico + - * / %
Atribuio = *= /= %= += -=
Incremento e Decremento
Ao invs de escrever:
int num1 = 0;
num1 = num1 + 1;

Escreva:
int num1 = 0;
num1++;

Isso funciona com todos os operadores
+ e -
Incremento e Decremento
Existem duas formas:

num1++;
++num1;

Exemplos:

int numero = 10;
int preresultado = ++numero; // preresulatdo =11
int posresultado = numero++; // preresulatdo =11

Precedncia
As expresses so resolvidos da esquerda
para direita (com exceo dos operaes de
igualdade)

x + y + z resolvido como ( x + y ) + z

Os operadores de igualdade so resolvidos da
direita para a esquerda

x = y = z resolvido como x = ( y = z )
Precedncia
Os operadores atitmticos *, / e % tem maior
precedncia do que os operadores + e

x + y * z resolvido como x + ( y * z )

Voc pode altetar a precedncia atravs do
uso de parnteses

( x + y ) * z
Exerccio


Desenvolva um programa em C# que declara
variveis do tipo simples, atribua valores a
estas variveis e mostre seus respectivos
valores na tela

Enumeraes
Definida atravs da palavra chave enum:
enum Cor { Branca, Preta, Azul }

Utilizando uma enumerao:
Cor corParede = Cor.Branca;

Mostrando valor de uma enumerao:
// Mostra Branca
Console.WriteLine( corParede );

Estruturas
Definida atravs da palavra chave struct:

public struct Pessoa
{
public string nome;
public int idade;
}

Utilizando uma estrutura:

Pessoa pes; // Declara a varivel
pes.nome = Joo; // Altera o valor
pes.idade = 25;
Exerccio



Desenvolver um programa em C# que faa uso
de enumeraes e estruturas


Convertendo Variveis
C# suporta dois tipos de converso:

Converso implcita de dados

Converso explcita dedados
Converso Implcita
O C# se encarrega de efetuar a converso:

int intValue = 123;
long longValue = intValue;


Converses implcitas no falham: podem
perder preciso, mas no magnitude
Converso Explcita
Para converses explicitas, voc deve utilizar
uma expresso cast:

long longValue = Int64.MaxValue;
int intValue = (int)longValue;


Converses explcitas podem falhar. Voc
pode tratar esse tipo de erro atravs do uso
do bloco checked
checked / unchecked
// Ser gerada uma exceo no caso de overflow
checked
{
long longValue = Int64.MaxValue;
int intValue = (int)longValue;
Console.WriteLine( intValue );
}

// No ser gerada uma exceo no caso de overflow
unchecked
{
long longValue = Int64.MaxValue;
int intValue = (int)longValue;
Console.WriteLine( intValue );
}
Exerccio



Desenvolver um programa em C# que faa
converso implcitas e explcitas de variveis






Comandos e excees
Objetivos
Utilizar bloco de comandos
Utilizar comandos de seleo
Utilizar comandos de repetio
Tratamento de excees

Bloco de comandos
Delimitado por { }
Voc pode aninhar blocos
Exemplo:
{
{
int numero;
numero = 5;
}
}
Exemplo 1
{
int numero;
numero = 5;
Console.WriteLine( "{0}", numero );
}
Console.WriteLine( "{0}", numero );
{
int numero;
numero = 10;
Console.WriteLine( "{0}", numero );
}
Exemplo 2
{
int numero;
{
int numero;
numero = 5;
Console.WriteLine( "{0}", numero );
}
}
Tipos de comandos
Seleo
if e switch

Repetio
while, do, for e foreach

Quebra e continuidade
break e continue
if
Sintaxe:

if (expresso booleana)
bloco de comandos do if
else
bloco de comandos do else


if exemplo 1
int numero = int.Parse( Console.ReadLine( ) );

if ( numero % 2 == 0 )
Console.WriteLine( "PAR" );
else
Console.WriteLine( "MPAR" );
if exemplo 2
int posicao = int.Parse( Console.ReadLine( ) );

if ( posicao == 1 )
Console.WriteLine( "OURO" );
else if ( posicao == 2 )
Console.WriteLine( "PRATA" );
else if ( posicao == 3 )
Console.WriteLine( "BRONZE" );
else
Console.WriteLine( "Treinar mais" );



if exemplo 3
int numero = int.Parse( Console.ReadLine( ) );

if ( numero < 10 )
numero++;
Console.WriteLine( numero );
Console.WriteLine( "Menor que dez" );
if exemplo 4
int numero = int.Parse( Console.ReadLine( ) );

if ( numero < 10 )
{
numero++;
Console.WriteLine( numero );
Console.WriteLine( "Menor que dez" );
}
Exerccio




Escolha um dos exemplos apresentados do
comando if e coloque-o em prtica
switch
Sintaxe:

switch ( varivel )
{
case constante1:
bloco de comandos
case constante2:
bloco de comandos
case constante3:
bloco de comandos
default:
bloco de comandos
}

switch exemplo 1
int mes = int.Parse( Console.ReadLine( ) );
int dias;
switch ( mes )
{
case 2:
dias = 28;
break;
case 4:
case 6:
case 9:
case 11:
dias = 30;
break;
default:
dias = 31;
break;
}
Console.WriteLine( dias );

Exerccio



Desenvolva um pequeno menu e trata a opo
digitada pelo usurio fazendo uso do comando
switch
while
Sintaxe:

while ( expresso booleana )
{
bloco de comandos
}
while exemplo 1
int contador = 0;
while (contador < 10 )
{
contador++;
Console.WriteLine( "{0}", contador );
}
while exemplo 2
int contador = 10;
while (contador < 10 )
{
contador++;
Console.WriteLine( "{0}", contador );
}
do while
Sintaxe:

do
{
bloco de comandos
}
while ( expresso booleana );

do while exemplo 1
int contador = 0;
do
{
contador++;
Console.WriteLine( "{0}", contador );
}
while ( contador < 10 );
do while exemplo 2
int contador = 10;
do
{
contador++;
Console.WriteLine( "{0}", contador );
}
while ( contador < 10 );
for
Sintaxe:

for ( inicializao ; condio ; incremento )
{
bloco de comandos
}
for exemplo 1
for ( int i = 1 ; i <= 10 ; i++ )
{
Console.WriteLine( "{0}", i );
}
for exemplo 2
for ( int i = 1 ; i <= 10 ; i++ )
{
Console.WriteLine( "{0}", i );
}
Console.WriteLine( "{0}", i );
for exemplo 3
for ( int i = 1, k = 1 ; i <= 10 ; i++, k++ )
{
Console.WriteLine( "{0}", i );
Console.WriteLine( "{0}", k );
}


Exerccio



Desenvolva um programa em C# que solicite um
nmero ao usurio e imprima a tabuada desse
nmero



foreach
Sintaxe:

foreach ( varivel in coleo )
{
bloco de comandos
}

foreach exemplo 1
ArrayList numeros = new ArrayList( );
for( int contador = 1 ; contador <= 10 ; contador++ )
{
numeros.Add( contador );
}

foreach ( int numero in numeros )
{
Console.WriteLine( "{0}", numero );
}
continue / break
int i = 0;
while ( true )
{
i++;
if ( i > 10 )
{
break;
}
else
{
Console.WriteLine( i );
continue;
}
}
Exerccios
1 - Desenvolver um programa em C# que
solicita um nmero ao usurio e verifica se
este nmero e positivo ou negativo


2 - Desenvolver um programa em C# que
solicite dois nmeros ao usurio (base e
expoente) e calcule o valor da potncia

Exceptions
Exception
SystemException
OutOfMemoryException
IOException
NullReferenceException
ApplicationException
try...catch...finally
try
{
}
catch ( OverflowException oe )
{
}
catch ( InvalidCastException ice )
{
}
catch ( Exception e )
{
}
finally
{
}
try...catch exemplo - 1
try
{
int dividendo = int.Parse( Console.ReadLine( ) );
int divisor = int.Parse( Console.ReadLine( ) );
int resultado = dividendo / divisor;
Console.WriteLine( resultado );
}
catch ( Exception e )
{
Console.WriteLine( "Ocorreu um erro:\n" + e.Message);
}
finally
{
Console.WriteLine( Fim" );
}
throw
int minutos = int.Parse( Console.ReadLine( ) );
if ( minutos < 1 || minutos >= 60 )
{
throw new Exception( "horrio invlido" );
}
throw exemplo 1
try
{
int minutos = int.Parse( Console.ReadLine( ) );
if ( minutos < 1 || minutos >= 60 )
{
throw new Exception( "horrio invlido" );
}
Console.WriteLine( minutos );
}
catch ( Exception e )
{
Console.WriteLine( e.Message );
}
Exceptions
Todas as excees derivam (e devem
derivar) de System.Exception

Sempre utilizar uma exceo genrica
(Exception)

Ordem de tratamento: da exceo
menos genrica para a mais genrica
Exerccio



Desenvolver um programa em C# que solicite
dois nmeros ao usurio e mostre o resultado
dessa diviso na tela (faa uso do bloco
try...catch para tratamento de erros)






Mtodos e parmetros
Objetivos
Definir e utilizar mtodos estticos
Passar parmetros para mtodos
Definir e utilizar sobrecarga de mtodos
Mtodos
Sintaxe:

Modificador(es) Retorno Nome (Lista de parmetros)
{
Corpo do mtodo
}

Especificar:
Modificador(es) (opcional)
Retorno
Nome (identificador vlido)
Lista de parmetros
Corpo do mtodo
Mtodos
Exemplo 1
using System;

class Exemplo
{
static void DizerAlo( )
{
Console.WriteLine( "Alo" );
}
public static void Main( )
{
DizerAlo( );
}
}
Chamando Mtodos
Dentro da mesma classe:
Apenas especifique o nome do mtodo


De outra classe:
Especifique o nome da classe e o nome do
mtodo

Mtodos
Exemplo 2
using System;

class Exemplo
{
static void DizerAlo( )
{
Console.WriteLine( "Alo" );
}
public static void Main( )
{
Console.WriteLine( "Incio");
DizerAlo( );
Console.WriteLine( "Fim" );
}
}
using System;

class Um
{
public static void DizerAlo( )
{
Console.WriteLine( "Alo" );
}
}

class Dois
{
public static void Main( )
{
Um.DizerAlo( );
}
}


Mtodos
Exemplo 3
using System;
class Exemplo
{
static void Metodo1( )
{
Console.WriteLine( "UM" );
}
static void Metodo2( )
{
Metodo1( );
Console.WriteLine( "DOIS" );
Metodo1( );
}
public static void Main( )
{
Metodo2( );
Metodo1( );
}
}

Exerccio



Desenvolva um programa em C# que possua um
mtodo que escreva o seu nome na tela



return
using System;

class Exemplo
{
static void Main( )
{
Console.WriteLine( "Hello" );
return;
Console.WriteLine( "World" );
}
}

Variveis Locais
Variveis declaradas dentro de mtodos so
chamadas variveis locais

So visveis apenas para o mtodo onde foram
definidas

So criadas no incio da execuo do mtodo e
destrudas no final da execuo deste
Variveis
Exemplo 1
using System;

class Exemplo
{
static void Contar( )
{
numero++;
}
public static void Main( )
{
int numero = 0;
Contar( );
Console.WriteLine( numero );
}
}
Variveis
Exemplo 2
using System;

class Exemplo
{
static int numero = 0;
static void Contar( )
{
numero++;
}
public static void Main( )
{
Contar( );
Console.WriteLine( numero );
}
}
Variveis
Exemplo 3
using System;

class Exemplo
{
static int numero = 0;
static void Contar( )
{
numero++;
}
public static void Main( )
{
int numero = 0;
Contar( );
Console.WriteLine( numero );
}
}
Retornando valores
Declarar o mtodo sem o tipo void

Especificar o tipo de dado de retorno do
mtodo no lugar da palavra void

Especificar o valor de retorno no comando
return

Um mtodo no void sempre deve retornar
um valor
Retornando valores
Exemplo
using System;

class Exemplo
{
static int GetNumero( )
{
Console.Write( "Digite um nmero: " );
int numero = int.Parse( Console.ReadLine( ) );
return ( numero );
}
public static void Main( )
{
int numero = GetNumero( );
Console.WriteLine( numero );
}
}
Exerccio



Desenvolver um programa em C# que possui
um mtodo que retorna a data de hoje e
imprima essa data na tela


Parmetros
Variveis que so passadas para os mtodos

Informar os parmetros entre parnteses aps
o nome dos mtodos

Defina o tipo de dado e o nome de cada
parmetro (se existir mais de um parmetro,
separ-los utilizando vrgulas)

Informar os parmetros na chamado do
mtodo
Parmetros
Exemplo
using System;

class Exemplo
{
static void DizerOla( string nome )
{
Console.WriteLine( "Ola " + nome );
}
public static void Main( )
{
string nome = "Joo";
DizerOla( nome );
}
}
Exerccio

Desenvolver um programa em C# que possui
um mtodo que efetua a operao matemtica
de soma.

Solicite dois nmeros ao usurio e utilize esse
mtodo para somar esses nmeros e mostrar
o resultado na tela

Passagem de Parmetros

in


Passagem por valor
in
out

Passagem por referncia

out

Parmetros de sada (output)
Passagem por valor
Mecanismo padro de passagem de parmetro

Parmetro pode ser alterado no corpo do
mtodo e no ter efeito no valor do varivel
utilizada na chamada do mtodo


Passagem por valor
Exemplo
using System;
class Exemplo
{
static void SomarUm( int numero )
{
numero++;
}
public static void Main( )
{
int num = 1;
SomarUm( num );
Console.WriteLine( num );
}
}
Passagem por referncia
uma referncia para uma mesma regio na
memria

Utilizar a palavra chave ref na definio e na
chamada do mtodo

Alteraes no parmetro ir afetar a varivel
utilizada na chamada do mtodo

Utilizar a palavra chave ref para cada um dos
parmetros do mtodo que so referncia(s)

Sempre inicialize a varivel antes de utiliz-la
como parmetro de referncia
Passagem por referncia
Exemplo
using System;
class Exemplo
{
static void SomarUm( ref int numero )
{
numero++;
}
public static void Main( )
{
int num = 1;
SomarUm( ref num );
Console.WriteLine( num );
}
}
Parmetros de sada
Tambm uma referncia para a mesma
regio na memria

Utilizar a palavra chave out na definio e na
chamada do mtodo

Utilizar a palavra chave out para cada um dos
parmetros do mtodo que so de sada

Voc no precisa inicializar a varivel antes de
utiliz-la como parmetro de sada

Parmetro de sada
Exemplo
using System;
class Exemplo
{
static void GetNomeIdade( out string nome, out int idade )
{
Console.Write( "Digite seu nome: " );
nome = Console.ReadLine( );
Console.Write( "Digite sua idade: " );
idade = int.Parse( Console.ReadLine( ) );
}
public static void Main( )
{
string nome;
int idade;
GetNomeIdade( out nome, out idade );
Console.WriteLine( "Nome: " + nome + "\nIdade: " + idade.ToString( ) );
}
}
Exerccio



Colocar em prtica os exerccios vistos at aqui
para visualizar as diferenas entre os
mecanismos de passagem de parmetros

Lista de parmetros variada
Utilizar quando no se sabe ao certo o nmero
de parmetros que o mtodo ir receber

Utilizar a palavra chave params

Deve ser sempre o ltimo parmetro da lista
de parmetros

Mecanismo utilizado sempre passagem por
valor
Lista de parmetros variada
Exemplo
using System;

class Exemplo
{
static void Nomes( params string[ ] nomes )
{
foreach( string nome in nomes )
{
Console.WriteLine( nome );
}
}
public static void Main( )
{
Nomes( "Joo", Tiago", "Leonardo", "Rodolfo" );
}
}

Sobrecarga de mtodos
Mtodos com mesmo nome em uma classe,
porm com assinaturas diferentes


Os mtodos devem possuir listas de
parmetros diferentes


Voc no pode compartilhar nomes entre
variveis, enumeraes, estruturas, etc...
Apenas entre mtodos
Assinatura de mtodos
Definio:
Nome do mtodo
Tipo de dado dos parmetros
Modificador do(s) parmetro(s) (ref e out)


No tem efeito:
Nome(s) do(s) parmetro(s)
Tipo de dado de retorno do mtodo
Sobrecarga de mtodos
Exemplo
using System;

class Exemplo
{
static int Soma( int num1, int num2 )
{
return ( num1 + num2 );
}
static int Soma( int num1, int num2, int num3 )
{
return ( num1 + num2 + num3 );
}
public static void Main( )
{
Console.WriteLine( Soma( 1, 2 ) );
Console.WriteLine( Soma( 1, 2, 3 ) );
}
}
Exerccio



Desenvolver um programa em C# que faa uso
de sobrecarga de mtodos






Matrizes (vetores)
Objetivos
Viso geral de matrizes
Criando matrizes
Utilizando matrizes
Colees
Matrizes
Utilizada para agrupamento de dados

uma seqncia de elementos

Todos os elementos devem ser do mesmo tipo
de dado

Elementos so acessados utilizando-se um (ou
mais) ndice(s) inteiro(s)
Matrizes
Exemplo 1
using System;

class Matrizes
{
static void Main( )
{
int num1 = 1;
int num2 = 2;
int num3 = 3;
int num4 = 4;
int num5 = 5;
Console.WriteLine( num1 );
Console.WriteLine( num2 );
Console.WriteLine( num3 );
Console.WriteLine( num4 );
Console.WriteLine( num5 );
}
}
using System;

class Matrizes
{
static void Main( )
{
int[ ] numeros = new int[5]
{1, 2, 3, 4, 5};
for ( int i = 0 ; i < 5 ; i++ )
{
Console.WriteLine(numeros[i]);
}
}
}
Matrizes Notao em C#
Sintaxe:

tipo_de_dado[ ] nome_da_matriz;


Especificar:
Tipo de dado dos elementos da matriz
Colchetes (sem o nmero de elementos)
O nome da varivel da matriz
Declarando Matrizes
Matrizes de uma dimenso (unidimensionais)

int[ ] numeros;

Um ndice associado a cada elemento da matriz

Matrizes de duas dimenses (bidimensionais)

int [ , ] numeros;

Dois ndices associados a cada elemento da matriz

Cada vrgula utilizada entre os colchetes cria
uma nova dimenso para a matriz
Acessando Elementos
Informe o nome da matriz e ndice desejado
entre colchetes

int num = numeros[ 1 ];
int num = numeros[ 1, 1 ];

O elemento inicial da matriz acessado
atravs do ndice 0

int num = numeros[ 0 ];
int num = numeros[ 0, 0 ];
Alterando Elementos
Informe o nome da matriz e ndice desejado
entre colchetes

numeros[ 1 ] = 10;
numeros[ 1, 1 ] = 10;

Criando Matrizes

Apenas declarar a matriz no cria uma instncia da
mesma (as matrizes so tipos de dados referncia e no
tipos simples)

Voc deve utilizar a palavra chave new para criar uma
instncia da matriz

Voc deve especificar a dimenso da matriz no
momento da criao (voc no poder redimensionar a
matriz aps sua criao)

Os elementos da matriz so implicitamente inicializados
Matrizes
Exemplo 2
using System;

class Matrizes_2
{
static void Main( )
{
int[ ] numeros = new int[ 5 ];
for ( int i = 0 ; i < 5 ; i++ )
{
Console.WriteLine( numeros[ i ] );
}
}
}
Exerccio



Desenvolver um programa em C# que declara e
cria matrizes. Acesse e altere os elementos
dessas matrizes

Inicializando Matrizes
Voc pode inicializar os elementos da matriz
no momento da criao com valores que
desejar

Voc pode utilizar expresses complexas na
inicializao de matrizes (variveis,
expresses, mtodos, etc)

Voc sempre deve explicitamente inicializar
todos os elementos da matriz (o nmero total
de elementos da matriz)
Matrizes
Exemplo 3
using System;

class Matrizes_3
{
static void Main( )
{
int[ ] numeros = new int[ 5 ] { 1, 2, 3, 4, 5 };

for ( int i = 0 ; i < 5 ; i++ )
{
Console.WriteLine( numeros[ i ] );
}
}
}

Inicializando Matrizes
Multidimensionais

Todas as regras para inicializao de matrizes
unidimensionais devem ser seguidas na
inicializao de matrizes multidimensionais

Voc deve inicializar todos os elementos de
todas as dimenses da matriz
multidimensional
Matrizes
Exemplo 4
using System;

class Matrizes_4
{
static void Main( )
{
int[ , ] numeros = { { 1, 2, 3 }, { 4, 5, 6 } };

for ( int i = 0 ; i < 2 ; i++ )
{
for ( int k = 0 ; k < 3 ; k++ )
{
Console.WriteLine( numeros[ i, k ] );
}
}
}
}
Exerccio



Alterar o exerccio anterior para inicializar as
matrizes criadas

Dimensionando Matrizes
em Tempo de Execuo

O nmero de elementos de uma matriz no
precisa ser uma constante (pode ser definido
em tempo de execuo)

Se definido em tempo de execuo, no
podemos inicializar explicitamente os
elementos da matriz
Matrizes
Exemplo 5
using System;

class Matrizes_5
{
static void Main( )
{
Console.Write( "Nmero pessoas: " );
int numPessoas = int.Parse( Console.ReadLine( ) );

string[] pessoas = new string[ numPessoas ];

for( int i = 0 ; i < numPessoas ; i ++ )
{
Console.Write( "{0} pessoa: ", ( i + 1 ) );
pessoas[ i ] = Console.ReadLine( );
}

for ( int i = 0 ; i < numPessoas ; i++ )
{
Console.WriteLine( pessoas[ i ] );
}
}
}
Copiando Matrizes
Quando voc faz a cpia de uma matriz, na
verdade as duas variveis esto apontando
para a mesma regio na memria


Isso se deve ao fato das matrizes serem tipos
de dados referncia e no tipos de dados
simples


Matrizes
Exemplo 6
using System;

class Matrizes_6
{
static void Main( )
{
int[] numeros = { 1, 2, 3, 4, 5 };
int[] copiaNumeros = numeros;

copiaNumeros[ 0 ]++;

Console.WriteLine( numeros[ 0 ] );
Console.WriteLine( copiaNumeros[ 0 ] );
}
}
Propriedades e Mtodos das
Matrizes

As matrizes so implicitamente derivadas de
System.Array. Esta classe fornece uma srie
de mtodos e propriedades interessantes para
manipulao de matrizes

Os elementos das matrizes podem ser
percorridos com o comando foreach

Propriedades
Rank: contm a dimenso da matriz

Length: contm o nmero de elementos da
matriz

int[ ] numeros = new numeros[ 5 ]
rank = 1
lenght = 5

int[ , ] numeros = new numeros[ 2, 4 ]
rank = 2
lenght = 8
Matrizes
Exemplo 7
using System;

class Matrizes_7
{
static void Main( )
{
int[] numeros1 = { 1, 2, 3, 4, 5 };
Console.WriteLine( "Rank..: {0}", numeros1.Rank );
Console.WriteLine( "Length: {0}", numeros1.Length );

int[,] numeros2 = { { 1, 2, 3, 4, 5 }, { 6, 7, 8, 9, 10 } };
Console.WriteLine( "Rank..: {0}", numeros2.Rank );
Console.WriteLine( "Length: {0}", numeros2.Length );
}
}
Mtodos
Sort: ordena os elementos da matriz de uma dimenso

Clear: reseta elementos da matriz para as posies
informadas

Clone: cria uma cpia da matriz (nova instncia)

GetLength: retorna a dimenso da matriz. Possui
comportamento diferente entre matrizes
unidimensionais e multidimensionais

IndexOf: retornar a posio de um determinado
elemento dentro de uma matriz. Se o elemento no for
encontrado, retorna -1
Matrizes
Exemplo 8
using System;

class Matrizes_8
{
static void Main( )
{
int[] numeros = new int[ 5 ] { 5, 3, 1, 2, 4 };
System.Array.Sort( numeros );
for( int i = 0 ; i < numeros.Length ; i++ )
{
Console.WriteLine( numeros[ i ] );
}
}
}
Exerccio

Desenvolver um programa que solicita um
nmero ao usurio

O programa dever solicitar ao usurio N
nmeros

Imprimir os N nmeros digitados ordenados
Retornando Matrizes de
Mtodos
using System;

class Matrizes_9
{
static void Main( )
{
int[] numeros = GetNumeros( );
for ( int i = 0 ; i < numeros.Length ; i ++ )
{
Console.WriteLine( numeros[ i ] );
}
}
static int[] GetNumeros( )
{
int[] numeros = new int[5] { 1, 2, 3, 4, 5 };
return ( numeros );
}
}
Passando Matrizes como
Parmetro para Mtodos
using System;

class Matrizes_10
{
static void Main( )
{
int[] numeros = new int[ 5 ] { 1, 2, 3, 4, 5 };
ImprimeNumeros( numeros );
}
static void ImprimeNumeros( int[ ] numeros )
{
for ( int i = 0 ; i < numeros.Length ; i ++ )
{
Console.WriteLine( numeros[ i ] );
}
}
}
Argumentos de Linha de
Comando
using System;

class Matrizes_11
{
static void Main( string[] args )
{
for ( int i = 0 ; i < args.Length ; i++ )
{
Console.WriteLine( args[ i ] );
}
}
}
Percorrendo Matrizes com
o comando foreach
using System;

class Matrizes_12
{
static void Main( )
{
int[] numeros = new int[ 5 ] { 1, 2, 3, 4, 5 };
foreach ( int numero in numeros )
{
Console.WriteLine( numero );
}
}
}

Exerccio



Alterar o exerccio anterior para percorrer a
matriz utilizado o comando foreach
Consideraes sobre
Matrizes
Voc no pode redimensionar uma matriz
aps a sua criao

Voc s pode armazenar elementos de mesmo
tipo em uma matriz

Em geral, matrizes so rpidas, mas pouco
flexveis

Para superar essas carncias, podemos fazer
uso de colees
Colees
using System;
using System.Collections;

public class Colecao
{
static void Main( )
{
ArrayList lista = new ArrayList( );
lista.Add( "TouchAndThink" );
lista.Add( 99 );
lista.Add( true );
lista.Add( DateTime.Now );
foreach( object elemento in lista )
{
Console.WriteLine( elemento.ToString( ) );
}
}
}




Fundamentos da
programao orientada
a objetos
Objetivos
Classes e objetos
Abstrao
Encapsulamento
Membros estticos
Herana
Polimorfismo
Orientao a objetos em C#
Classe
Uma molde que descreve
comportamento e atributos padres de
uma determinada entidade

Exemplo: todos os carros possuem
comportamento e caractersticas que
so padres entre todos os carros
(conjunto de todos os carros)
Classe
Composta por membros:

Campos (caractersticas, propriedades)
Nome
Cor
Ano

Mtodos (operaes)
Ligar
Acelerar
Brecar
Objeto
Um objeto uma instncia (ocorrncia)
de uma classe

Exemplo: uma ferrari seria um exemplo
de uma instncia da classe carro
Tipo Valor x Tipo Referncia
Tipo valor
Tipos de dados simples
int, decimal, char, bool, enum, struct
Armazenados na pilha (stack)

Tipo referncia
Objetos
SqlConnection, Console, nossas classes
Armazenados na memria dinmica (heap)
Tipo Valor x Tipo Referncia
Exemplo
using System;
using System.Collections;

class TipoSimplesReferencia
{
static void Main( )
{
int numero;
numero = 0;

ArrayList lista = new ArrayList( );
lista.Add( 0 );
}
}
Abstrao
Abstrao consiste em focalizar os
aspectos essenciais inerentes a uma
entidade e ignorar propriedades
acidentais

Abstrao pode ser definida como a
capacidade de representar cenrios
complexos usando termos simples

Fonte: MSDN Magazine
Abstrao
Deve levar em considerao aspectos
importantes da entidade e descartar aspectos
desnecessrios

A classe deve fornecer comportamento
essencial da entidade modelada e de maneira
fcil e simples de ser utilizada

A abstrao, quando bem aplicada, faz coisas
complexas parecerem simples
Encapsulamento


Encapsulamento pode ser definido
como a tarefa de tornar um objeto
o mais auto-suficiente possvel


Fonte: MSDN Magazine
Encapsulamento
Combinar dados e mtodos em uma cpsula (classe)

Controlar o acesso a membros da cpsula (classe)

Mtodos so pblicos, acessveis do lado de fora da
classe (palavra chave public)

Atributos so privados, acessveis somente pela
classe (palavra chave private)

Facilidade de uso: esconder a complexidade do
comportamento da entidade na classe (chamada a
mtodos)
Encapsulamento
Exemplo
using System;

class ContaBancaria
{
private decimal saldo;

public void Deposito ( decimal valor )
{
this.saldo += valor;
}

public bool Saque ( decimal valor )
{
bool sucesso = ( this.saldo >= valor );
if ( sucesso )
{
this.saldo -= valor;
}
return ( sucesso );
}

public decimal SaldoConta( )
{
return ( this.saldo );
}
}
Campos do Objeto
Campos que descrevem caractersticas de objetos
individuais

Exemplos:
cada carro possui um nmero de placa diferente
cada pessoa possui um nmero de cpf diferente
Cada conta bancria possuiu seu prprio saldo

Voc precisa criar uma instncia da classe para fazer
uso de campos de objetos
Campos Estticos
Campos que descrevem caractersticas de todos os
objetos de uma classe

Campos no nvel da classe

Exemplos:
todos os carros possuem quatro rodas
todas as contas bancarias possuem mesma taxa de
rendimento mensal

Voc no precisa criar uma instncia da classe para
fazer uso de campos estticos
Mtodos Estticos
Assim como os campos estticos, os mtodos estticos
esto no nvel da classe

Mtodos estticos s podem acessar atributos estticos

A chamada para um mtodo esttico efetuada no nvel
da classe e no nvel do objeto

Voc no precisa criar uma instncia da classe para
fazer uso de mtodos estticos

Membros Estticos
Exemplo 1
using System;

class PessoaNaoEstatica
{
public void Falar( string frase )
{
Console.WriteLine( frase );
}
}

class TestePessoaNaoEstatica
{
static void Main( )
{
PessoaNaoEstatica pes = new PessoaNaoEstatica( );
pes.Falar( "TouchAndThink.NET" );
}
}
Membros Estticos
Exemplo 2
using System;

class PessoaEstatica
{
public static void Falar( string frase )
{
Console.WriteLine( frase );
}
}
class TestePessoaEstatica
{
static void Main( )
{
PessoaEstatica.Falar( "TouchAndThink.NET" );
}
}
Exerccio



Colocar os exemplos de membros estticos e
no estticos em prtica para perceber a
diferena entre eles
Definindo Classes
Fazer uso da palavra chave class

Definir campos e mtodos da classe

Sintaxe semelhante da definio de estruturas

Boa prtica: mtodos pblicos, campos
privados (recomendao)
Definio de Classes
Exemplo
using System;

class Pessoa
{
private string nome;
private int idade;
private char sexo;

public void Falar( string frase )
{
Console.WriteLine( frase );
}
}
Exerccio



Escrever uma classe em C# que abstrai e
encapsula algumas caractersticas de um carro
Modificadores de Tipo de
Acesso
Public: acesso no limitado

Private: acesso limitado ao escopo da classe.

Voc pode combinar os modificadores de acesso
com static

Se voc no especificar um modificador de tipo
de acesso para um membro da classe, este ser
por padro private (campos e mtodos)
Modificadores
Exemplo
using System;

class Pessoa
{
private string nome;
private int idade;
private char sexo;

public void Falar( string frase )
{
Console.WriteLine( frase );
}
}
Criando Objetos
Apenas declarar uma varivel de uma classe
no cria um objeto desta classe

Faa uso do operador new para criar um
objeto de uma determinada classe

Todos os campos da classe so inicializados
quando criamos um objeto

Criar um objeto muitas vezes chamado de
instanciar um objeto
Criando Objetos
Exemplo
using System;

//Definio da classe

class TestePessoa
{
static void Main( )
{
Pessoa pes1 = new Pessoa( );
pes1.Falar( "Oi" );
}
}
Exerccio



Escrever uma classe que crie objetos da classe
carro criada no exerccio anterior
Palavra chave this
this se refere implicitamente ao objeto atual

Pode ser resolvida para se resolver problemas
de conflito de escopo

Mtodos estticos no podem fazer uso da
palavra chave this (pois mtodo estticos se
encontram no nvel da classe)
this
Exemplo
class Carro
{
private string cor;

public void Pintar( string cor )
{
// cor = cor; <- comportamento estranho
this.cor = cor;
}
}
Herana


Herana pode ser definida como a
capacidade de uma classe herdar
atributos e comportamento de
uma outra classe

Fonte: MSDN Magazine
Herana
Herana especifica um relacionamento um
tipo de entre classes

Novas classes especializando classes
existentes

A classe derivada herda todos os membros da
classe base
Herana
Imposto
ICMS
Classe Deivada
Classe Base Generalizao
Especializao
Herana
Hierarquia de classes: classes que derivam de
classes derivadas (recomenda-se no mximo
de 5 a 7 nveis de herana)

Herana simples: ocorre quando uma classe
derivada de apenas uma classe

Herana mltipla: ocorre quando uma classe
derivada de duas ou mais classes
Polimorfismo


Polimorfismo significa muitas
formas ou o estado de existir em
muitas formas


Fonte: MSDN Magazine
Polimorfismo
O nome do mtodo reside na classe base
(operao)

A implementao do mtodo reside nas
classes derivadas

Cada implementao pode possuir um
comportamento diferente
Polimorfismo
+CalcularValor()
Imposto
+CalcularValor()
ICMS
+CalcularValor()
IPI
Pergunta
Orientao a objetos s isso?


Resposta
No, esses so apenas os quatro
pilares da OOP

Classes Abstratas
Classes que existem para serem
implementadas (classes que derivem dela)

No podemos criar instncias de classes
abstratas

Podemos apenas criar instncias de classes
concretas

As operaes em classes abstratas podem
conter implementao
Classes Abstratas
Imposto
ICMS IPI
Classe Abstrata
Classes Concretas
Interfaces
Interfaces contm apenas operaes, sem
nenhuma implementao

Voc tambm no pode criar instncias de
interfaces

As operaes em interfaces no podem conter
implementao

As interfaces devem ser implementadas por
classes (derivadas)

Geralmente as interfaces esto no topo da
hierarquia de classes
Interfaces
Imposto
interface
IImposto
ICMS




Utilizando variveis do
tipo referncia

Objetivos
Utilizando variveis do tipo referncia
Hierarquia de objetos
Classes do .NET Framework
Namespaces em .NET Framework
Converso de dados do tipo referncia
Classe que Iremos Utilizar
using System;

class Pessoa
{
public string nome;
public int idade;

public void Falar( string frase )
{
Console.WriteLine( frase );
}
}

class Homem : Pessoa
{
}

class Mulher : Pessoa
{
}
Exerccio




Vamos implementar essas classes pois elas
sero utilizadas ao longo deste captulo
Tipo Valor x Tipo Referncia
Tipo valor
Tipos de dados simples
Exemplo: int, decimal, char, bool, enum, struct
Armazenados na pilha (stack)
Contm diretamente o valor da varivel

Tipo referncia
Tipos de dados complexos, mais poderosos (objetos)
Exemplo: SqlConnection, Console, nossas classes
Armazenados na memria dinmica (heap)
A varivel contm uma referncia para os dados
(que so armazenados em uma outra rea da
memria)
Declarando Variveis do
Tipo Referncia
Declarando:
Pessoa pes;

Criando uma instncia da classe (objeto):
pes = new Pessoa( );

Declarando e criando em uma nica linha:
Pessoa pes = new Pessoa( );

Depois de criado, voc pode acessar os membros do
objeto atravs do operador .

Voc sempre deve instanciar um objeto antes de utiliz-lo,
caso contrrio receber uma exceo do tipo
NullReferenceException
Destruindo Variveis do
Tipo Referncia
Destruindo explicitamente:

pes = null;


Destruindo implicitamente:

Apenas deixe o escopo em que a varivel est contida
terminar.


Variveis do Tipo
Referncia
using System;

class CreateAndDestroy
{
static void Main( )
{
Pessoa pes = new Pessoa( );
pes.nome = "Joo";
pes.idade = 25;
pes = null;
}
}
Comparando Variveis
Value types:
==
!=
comparam os valores

Reference types:
==
!=
comparam as referncias, no os valores

Para os tipos de referncia no podemos utilizar
os outros operadores relacionais (<,>,<= e >=)
Comparando Variveis
Exemplo
using System;

class Comparing
{
static void Main( )
{
Pessoa pes1 = new Pessoa( );
pes1.nome = "Joo";

Pessoa pes2 = new Pessoa( );
pes2.nome = "Joo";

if ( pes1 == pes2 )
Console.WriteLine( "Iguais" );
else
Console.WriteLine( "Diferentes" );

}
}
Referncias Para o Mesmo
Objeto
Duas referncias podem apontar para o
mesmo objeto

Variveis do tipo referncia mantm uma
referncia para os dados

Duas maneiras de acessar o mesmo objeto
para leitura/escrita
Referncias Para o Mesmo
Objeto

using System;

class MultipleReference
{
static void Main( )
{
Pessoa pes1 = new Pessoa( );
Pessoa pes2 = pes1;

pes1.nome = "Joo";

Console.WriteLine( pes1.nome );
Console.WriteLine( pes2.nome );
}
}
Exerccio


Desenvolver um programa em C# que declara
duas variveis do tipo referncia que fazem
referncia para o mesmo objeto

Destrua essas variveis aps sua utilizao
Parmetros
Variveis do tipo referncia aceitam as
trs formas de passagem de
parmetros:

Passagem por valor

Passagem referncia

Parmetros de sada

Passagem por Valor
O mtodo recebe uma cpia da referncia
(duas variveis)

Durante a execuo do mtodo as duas
variveis estaro se referenciando ao
mesmo objeto

Isso significa que qualquer alterao no
parmetro, no ir alterar o objeto ao qual
ele faz referncia
Passagem por Valor
Exemplo
using System;

class ParamRefByValue
{
static void TrocarNome( Pessoa p )
{
p.nome = "Leandro";
}

static void Main( )
{
Pessoa pes = new Pessoa( );
pes.nome = "Joo";
TrocarNome( pes );
Console.WriteLine( pes.nome );
}
}
Passagem por Referncia
O mtodo recebe a mesma referncia (apenas
uma varivel)

Nesse caso teremos apenas uma referncia
para o objeto

Qualquer alterao no parmetro ir afetar a
varivel diretamente
Passagem por Referncia
Exemplo
using System;

class ParamRefByRef
{
static void TrocarNome( ref Pessoa p )
{
p = new Pessoa( );
p.nome = "Leandro";
}

static void Main( )
{
Pessoa pes = new Pessoa( );
pes.nome = "Joo";
TrocarNome( ref pes );
Console.WriteLine( pes.nome );
}
}
Parmetro de Sada
O mtodo recebe a mesma referncia (apenas
uma varivel)

Nesse caso teremos apenas uma referncia
para o objeto

Qualquer alterao no parmetro ir afetar a
varivel diretamente

o mesmo critrio da passagem por
referncia, com a diferena de que o
parmetro tem que ser alterado
Parmetro de Sada
Exemplo
using System;

class ParamRefByOut
{
static void TrocarNome( out Pessoa p )
{
p = new Pessoa( );
p.nome = "Leandro";
}

static void Main( )
{
Pessoa pes = new Pessoa( );
pes.nome = "Joo";
TrocarNome( out pes );
Console.WriteLine( pes.nome );
}
}
Exerccio



Desenvolver um programa em C# que faz uso
de parmetros (por valor, por referncia e
parmetro de sada) com variveis do tipo
referncia
Excees
Exception uma classe do .NET
Framework

Somente objetos do tipo Exception (ou
derivados) pode ser utilizando nos
comandos catch ou throw

Todas as excees so derivadas de
System.Exception
string
string uma classe

A palavra chave string um atalho para a
classe System.String

Imutvel: depois de definida, a string no
pode ser alterada. Quando alterada, na
verdade criada uma nova instncia da classe
contendo a modificao

StringBuilder: classe para construo de
strings otimizada
Propriedades e Mtodos
Mtodos
Insert
Copy
Concat
Trim
ToUpper
ToLower
Equals
Propriedades
Brackets [ ]
Lenght


string
Exemplo
public class ClassString
{
static void Main( )
{
string celula = "TouchAndThink";

char prim = celula[ 0 ];
Console.WriteLine( "Primeiro caracter: " + prim );

int size = celula.Length;
Console.WriteLine( "Propriedade Lenght: " + size );

// Verificar demais exemplos na ClassString.cs

}
}
Operadores de
Comparao de Strings
Os operadores == e != so sobrecarregados
para a classe string e podem ser utilizados na
comparao de strings

O operador == equivalente ao mtodo
String.Equals( )

O operador != equivalente ao mtodo
! String.Equals( )

Os operadores relacionais (<;>,<=,>=) no
podem ser utilizados para a classe string
Exerccio




Desenvolver um programa em C# que utilize
mtodos e propriedades da classe string
Hierarquia de Objetos
Todas as classes no .NET Framework derivam
ultimamente de object (direta ou
indiretamente)

O tipo object um apelido para
System.Object

object a classe base de todas as classes

Quando voc cria uma classe e no especifica
nenhuma classe pai, voc est na verdade
derivando de object
Mtodos Comuns
Mtodos pertencentes a classe object:

ToSring
Equals
GetType
Finalize

Voc pode sobrescrever esses mtodos para
fornecer o comportamento desejado

Todos os objetos possuem esses mtodos
Mtodos Comuns
Exemplo
using System;

class CommomMethods
{
static void Main( )
{
Pessoa pes = new Pessoa( );
Console.WriteLine( pes.ToString( ) );
}
}
Reflection
Obter informaes do tipo de objeto em tempo
de execuo isso chamado de reflection

Gerenciado pelo namespace System.Reflection

Formas de obter o tipo de um objeto:

Operador typeof

Mtodo GetType da classe object

Classe System.Type. Com esta classe
podemos obter informaes detalhadas de
um objeto (campos, mtodos, etc)
Reflection
Exemplo
using System;
using System.Reflection;

class Reflection
{
static void Main( )
{
Type tipo = typeof(Pessoa);
Console.WriteLine( "Tipo: {0}", tipo );

Pessoa pes = new Pessoa( );
Type tipo2 = pes.GetType( );
Console.WriteLine( "Tipo: {0}", tipo2 );
}
}
Namespaces
System.IO: classes para manipulao de
arquivos e diretrios

System.XML: suporte a XML e aos vrios
padres desta linguagem (NameSpace,
Schemas, XPath, XSLT, DOM)

System.Data: classes que constituem o
ADO.NET (um namespace para cada provider)

System.Windows.Forms: classes do
Windows Forms

System.Web: classes do ASP.NET
Converso de Dados
Value Types
Implcita

Explcita (utilizando o operador cast)

Classe System.Convert

Quando explcita pode gerar uma exceo
(interessante incluir converses explcitas em
um bloco try...catch...finally)
Converso de Dados
Exemplo
using System;

class ConvertingValueType
{
static void Main( )
{
// Converso implcita
int numInt = 10;
long numLong;
numLong = numInt;

// Converso explcita
int numInt2;
long numLong2 = 10;
numInt2 = (int)numLong2;
}
}
Converso de Dados
Reference Types
Converso de filho para pai
Implcita ou explcita
Sempre d certo
Sempre podemos converter para object

Converso de pai para filho
Explcita (requer cast)
Pode gerar uma exeo (InvalidCastException)

Podemos utilizar operadores cast para converso
de tipo de dado de referncia
Converso de Dados
Exemplo
using System;

class ConvertingRefenceType
{
static void Main( )
{
// Converso implcita (filho para pai)
Homem hm = new Homem( );
Pessoa pes;
pes = hm; // OU pes = (Pessoa)hm;

// Converso explcita (pai para filho)
Pessoa pes2 = new Pessoa( );
Mulher ml = pes2 as Mulher;
}
}
Operador is
Retorna verdadeiro se a converso pode ser
feita (no efetua a converso efetivamente,
apenas testa)

um tipo de converso um tipo de
Operador is
Exemplo
using System;

class IsOperator
{
static void Main( )
{
Homem hm = new Homem( );
Pessoa pes;
if ( hm is Pessoa )
{
pes = hm;
Console.WriteLine( " uma pessoa" );
}
else
{
Console.WriteLine( "No uma pessoa" );
}
}
}
Operador as
Converso entre tipo de dado de referncia
(mesma coisa que o cast)

O CLR ir checar se a converso vlida

Se ocorrer erro na converso, no gera
exceo apenas retorna null

Sempre verifique o retorno desse tipo de
converso, seno ser gerada uma exceo do
tipo NullReferenceException
Operador as
Exemplo
using System;

class AsOperator
{
static void Main( )
{
Pessoa pes = new Pessoa( );
Homem hm = pes as Homem;
if ( hm == null )
{
Console.WriteLine( "Converteu" );
}
else
{
Console.WriteLine( "No Converteu" );
}
}
}
object
O objeto a base para todas as classes

Qualquer tipo de dado de referncia pode ser
convertido para object (implcita ou
explicitamente)

Qualquer tipo de dado de referncia pode ser
armazenado em object (explicitamente)


object
Exemplo
using System;

class ConvertingToObject
{
static void Main( )
{
Pessoa pes = new Pessoa( );
object obj;

// Trs maneiras de converter para object
obj = pes;
obj = (object)pes;
obj = pes as object;

// Duas maneiras e converter de object
pes = (Pessoa)obj;
pes = obj as Pessoa;
}
}
Boxing e Unboxing
Boxing
Converso de value type em reference type
Pode ser implcito ou explcito
Geralmente ocorre na passagem de
parmetros

Unboxing
Converso de reference type em value type
Tem que ser explicitamente
Pode gerar uma exceo
Boxing e Unboxing
Exemplo
using System;

public class BoxingUnboxing
{
static void Main( )
{
int numero = 10;
object box;
box = numero; // Boxing Implcito
box = (object)numero; // Boxing Explcito
Console.WriteLine( box );

numero = (int)box; // Unboxing
Console.WriteLine( numero );
}
}

Exerccio




Desenvolver um programa em C# que faa uso
de boxing e unboxing




Criando e destruindo
objetos
Objetivos
Utilizando mtodos construtores
Utilizando campos somente leitura
Utilizando constantes
Utilizando mtodos destrutores
Mtodos Construtores




So mtodos executados
automaticamente quando instanciamos
um objeto

Criando Objetos
Alocando memria (heap):
Utilizamos a palavra chave new

Chamando o mtodo construtor:
Especificar o nome da classe seguido de
parnteses

Os dois passos descritos acima devem ser
efetuados um uma nica linha

Todos os objetos seguem essa regra (mesmo
que implicitamente)
Construtor Padro
Acessibilidade pblica
Mesmo nome da classe
Sem tipo de dado de retorno (nem mesmo void)
Sem parmetros (*)
Inicializa todos os campos
Criado implicitamente pelo compilador se no
for criado explicitamente


(*) o construtor padro no recebe parmetros,
mas um mtodo construtor pode receber
parmetros
Construtor Padro
Exemplo
using System;

class Pessoa
{
public string nome;
public int idade;

public void Falar( string frase)
{
Console.WriteLine(frase);
}
}

class TestePessoa
{
static void Main()
{
Pessoa pes = new Pessoa();
pes.Falar("Ol");
}
}
Sobrescrevendo o
Construtor Padro
Podemos criar nossos prprios construtores


O construtor ir inicializar implicitamente os
campos que no forem inicializados
explicitamente


CUIDADO: se a inicializao falhar, no
teremos o objeto disponvel para uso. Procure
no fazer tarefas complexas nessa mtodo
Sobrescrevendo o
Construtor Padro
Exemplo
class Pessoa
{
public string nome;
public int idade;

public Pessoa()
{
this.nome = "Joo";
}
}
Sobrecarga de
Construtores
Construtores so mtodos e podem ser
sobrecarregados como qualquer outro mtodo


Mesmo nome, escopo, mas parmetros
diferentes


CUIDADO: se voc escrever um construtor, o
compilador no criar um construtor padro.
Voc ter que escrever um explicitamente
Sobrecarga de
Construtores Exemplo

class Pessoa
{
public string nome;
public int idade;

public Pessoa( string nome )
{
this.nome = nome;
}
}
Variveis Somente Leitura
Sintaxe:

readonly char sexo;

Regras para inicializao:

So inicializadas implicitamente
Podem ser inicializadas na declarao
Podem ser inicializadas no mtodo construtor

No podem ser alteradas
Constantes
Sintaxe:

const char sexo = M;

Seguem as mesmas regras das variveis
somente leitura
Construtores Privados
Construtor privado impede da classe de ser
instanciada

Mtodos da instncia no pode ser
executados, apenas mtodos estticos

Um mtodo interessante de programarmos
nossas antigas funes

O compilador no ir gerar um construtor
padro
Construtores Privados
Exemplo
using System;

class Funcoes
{
private Funcoes()
{
}

public static int Soma(int num1, int num2)
{
return (num1 + num2);
}
}
Construtores Estticos
Pode ser utilizado para inicializar campos estticos

Executado pelo class loader

Executado antes do construtor da instncia

No pode ser executado

No pode ter modificador de tipo de acesso

No pode ter parmetros

No pode conter a palavra chave this
Construtores Estticos
Exemplo
using System;

class Aplicacao
{
public static string nomeUsuario;
public static string razaoSocial;

static Aplicacao()
{
nomeUsuario = "Joo";
razaoSocial = "Razo Social";
}
}
Tempo de Vida de
Variveis
Tipo Valor
Passa a existir na declarao
Destruda no final do escopo

Tipo Referncia
Passa a existir na declarao
Destruda pelo Garbage Collection
Garbage Collection
Ir destruir e recuperar a memria dos
objetos que no esto mais utilizados

Somente objetos que no podem mais ser
referenciados so destrudos

Ir disparar o mtodo Finalize do objeto que
est sendo destrudo
Destrutores
Sem modificador de tipo de acesso
Sem tipo de dado de retorno (nem mesmo void)
Mesmo nome da classe com prefixo ~
Sem parmetros

No podemos executar ou sobrescrever o
mtodo Finalize

O compilador ir converter o mtodo destrutor
em um mtodo Finalize
Destrutores
Exemplo
using System;

class Pessoa
{
~Pessoa()
{
Console.WriteLine("Destrutor");
}
}
using
Sintaxe:

using (SqlConnection con = new SqlConnection( ) )
{
string strConexao = "";
con.ConnectionString = strConexao;
con.Open();
}

O objeto ser destrudo no final do bloco de comandos

A classe deve implementar a interface System.IDisposable




Herana em C#
Objetivos
Derivando classes
Implementando mtodos
Utilizando classes seladas
Utilizando interfaces
Utilizando classes abstratas
Herana
O operador de herana em C# o :

A classe derivada herda a maioria dos membros da
classe pai (menos os construtores e destrutores)

A classe base deve ser desenhada para suportar
herana

A classe derivada no pode ser mais acessvel do que a
classe pai

C# no suporte herana mltipla
Classe base
class Pessoa
{
public Pessoa()
{
}

public Pessoa( string nome )
{
this.nome = nome;
}

public void Falar( string frase )
{
Console.WriteLine(frase);
}
}
Herana
Exemplo
class Homem : Pessoa
{
}

class Mulher : Pessoa
{
}

class TestePessoas
{
static void Main()
{
Homem hm = new Homem( );
hm.Falar("Ol");
}
}
Protected
um modificador de tipo de acesso

Apenas a prpria classe e derivadas podem acessar os
membros com esse modificador de tipo de acesso

como um modificador public para as classes
derivadas e como private para classes externas

Membros protected so implicitamente protected nas
classes derivadas

No pode ser utilizado em estruturas
Protected
Exemplo

class Pessoa
{
protected string nome;
protected int idade;
.
.
.
}
Construtor Base
possvel executar o mtodo construtor da classe base.
Para isso:

A declarao do construtor deve utilizar a palavra
chave base
No possvel acessar construtores privados

Podemos utilizar a palavra chave base para acessar
membros da classe pai

O compilador ir efetuar uma chamada implcita ao
construtor da classe base se isso no for feito
explicitamente.

Cuidado com parmetros na execuo explcita de
mtodos na classe base
Construtor Base
Exemplo
class Homem : Pessoa
{
public Homem( string nome ) : base ( nome )
{
}
}

class Mulher : Pessoa
{
public Mulher( string nome ) : base ( nome )
{
}
}
Mtodos Virtuais
Mtodos que podem ser sobrescritos

Mtodos no virtuais no podem ser sobrescritos

Utilizados para implementar polimorfismo

Mtodo deve possuir implementao

Mtodos virtuais no podem ser estticos

Mtodos virtuais no podem ser privados
Mtodos Virtuais
Exemplo

class Pessoa
{
public virtual void Falar( string frase )
{
Console.WriteLine(frase);
}
}
Sobrescrevendo Mtodos
Especificar uma nova implementao para um mtodo
definido como virtual

Utiliza a palavra chave override

O mtodo deve possuir implementao

Os mtodos devem possuir a mesma assinatura (virtual e
override)

Voc pode sobrescrever um mtodo sobrescrito

Voc no pode utilizar override junto com virtual
(override implicitamente virtual)

override no pode ser utilizado junto com private ou
static
Sobrescrevendo Mtodos
Exemplos
class Mulher : Pessoa
{
public override void Falar(string frase)
{
Console.WriteLine(frase);
Console.WriteLine(frase);
}
}
Escondendo Mtodos
Fazer uso da palavra chave new para especificar uma
nova implementao para um mtodo

Esconde mtodos virtuais e no virtuais

Esconde mtodos que tenham a mesma assinatura

Voc pode utilizar new junto com virtual

new tambm pode ser utilizado em campos
Escondendo Mtodos
Exemplo

class Mulher : Pessoa
{
public new void Falar(string frase)
{
Console.WriteLine(frase + " - " + frase);
}
}
Classes Seladas
Classes seladas so classes que no podem ser
derivadas

Existem classes que no foram desenhadas para serem
derivadas

Faa isso atravs da palavra chave sealed

A classe System.String uma classe selada
Classes Seladas
Exemplo

sealed class Homem : Pessoa
{
public Homem( string nome ) : base ( nome )
{
}
}

sealed class Mulher : Pessoa
{
public Mulher( string nome ) : base ( nome )
{
}
}
Criando Interfaces
uma classe sem cdigo

Sintaxe semelhante a declarao de uma classe

Utilizar a palavra chave interface no lugar da palavra
chave class

Especifica um contrato que as classes que forem derivar
a interface tem que implementar

Recomenda-se utilizar o prefixo I para nomear
interfaces (padro)


Criando Interfaces (cont.)
Contm apenas as assinaturas dos mtodos (sem
modificadores de tipo de acesso)

Os mtodos das interfaces so pblicos por padro
(mas no podem conter public explicitamente)

Os mtodos de uma interface no podem conter
implementao

Interfaces tambm podem conter propriedades, eventos
e indexers (todos sem implementao)
Criando Interfaces
Exemplo


interface IPessoa
{
void Falar( string frase );
}
Implementando Interfaces
Uma classe pode implementar zero ou mais interfaces

Uma interface pode derivar de zero ou mais interfaces

A classe pode ser mais acessvel que a interface(s) que
ela implementa

Uma interface no pode ser mais acessvel que a(s)
interface(s) base(s)

A classe deve implementar todos os mtodos das
interfaces que esto sendo implementadas direta ou
indiretamente (mesmo tipo de retorno, nome e
parmetros)

Uma forma de implementar herana mltipla
Implementando Interfaces
Exemplo

class Pessoa : IPessoa
{
public virtual void Falar( string frase )
{
Console.WriteLine(frase);
}
}
Classes Abstratas
So classes que no podem ser instanciadas apenas
derivadas

Utilizar a palavra chave abstract

Mesma sintaxe de classes no abstratas (classes
concretas)

Pode conter implementao e mtodos

Podem implementar interface(s)
Classes Abstratas
Exemplo
abstract class Pessoa : IPessoa
{
protected string nome;
protected int idade;

public Pessoa()
{
}

public Pessoa( string nome )
{
this.nome = nome;
}

public virtual void Falar( string frase )
{
Console.WriteLine(frase);
}
}
Classes Abstratas X
Interfaces
Ambas existem para serem derivadas

Ambas no podem ser implementadas

Ambas no podem ser seladas

Interfaces no podem conter implementao (classes
abstratas podem)

Interfaces no podem declarar membros no pblicos

Interfaces s podem derivar interfaces




Agregao, namespace
e escopo avanado
Objetivos
Utilizando o modificador de tipo de
acesso internal
Utilizando agregao
Revisando escopo
Utilizando namespaces
Utilizando assemblies
internal
internal um modificador de tipo de acesso assim
como public, private e protected

Os membros especificados como internal so pblicos
para o assembly atual e privados para assemblies
externos

Pode ser utilizado no escopo global

Pode ser utilizando em classes, mtodos e campos

Modificador de tipo de acesso padro das classes

No pode ser utilizado em estruturas

No pode ser utilizado em mtodos destrutores
Modificadores de Tipos de
Acesso
public

private

protected

internal

protected internal
internal
Exemplo
using System;

internal class InternalAccess
{
internal string nome = "Joo";

static void Main( )
{
InternalAccess i = newInternalAccess( );
Console.WriteLine( i.nome );
}
}
Agregao
Uma das caractersticas da orientao a
objetos

um relacionamento entre objetos (com
multiplicidade)

Objetos complexos so construdos a partir de
objetos simples
Agregao
Exemplo
using System;

class Porta
{
public string cor;
}
class Janela
{
public string modoAbrir;
}
class Casa
{
public Porta portaCasa;
public Janela janelaCasa;
}


Revisando Escopo
Escopo determina o tempo de vida de
variveis locais

Determina a regio do programa que podemos
nos referir a nomes sem qualificao (this,
base) principalmente quando temos variveis
com mesmo nome em escopos diferentes

Determinado pelo { } (menos o escopo global)
Revisando Escopo
Exemplo
Quais escopos temos no exemplo abaixo?

class Casa
{
public Porta portaCasa = new Porta( );
public Janela janelaCasa = new Janela( );

static void Main( )
{
Casa cas = new Casa( );
cas.portaCasa.Abrir( );
cas.janelaCasa.Abrir( );
}
}
namespaces
Utilizados para resolver problemas de conflito entre
classes com mesmo nome

Organizao lgica de classes

ideal que classes para um mesmo propsito sejam
criadas em um mesmo namespace

Namespaces podem ser criados em diversos arquivos
(cada classe pode estar em um arquivo fonte diferente)

Voc no pode especificar um modificador de tipo de
acesso para um namespaces (eles so pblicos por
padro)

Shortland
Declarando namespaces
namespace Empresa
{
namespace Construcao
{
class Porta
{
public string cor;

public void Abrir( )
{
Console.WriteLine( "Abir porta" );
}
}
}
}
namespaces
Nome qualificado de uma classe deve conter o
namespace no qual a classe est contida

Nomes no qualificados somente podem ser utilizados
no mesmo escopo do namespace

Quando uma classe definida dentro de um
namespace, temos que utilizar o nome qualificado
quando formos acess-la (menos quando estivermos
dentro do namespace)

Podemos aninhar namespaces (namespaces dentro de
namespaces)
using
Traz o nampespace para o escopo atual

Pode ser utilizado para namespaces aninhados

Deve ser a(s) primeira(s) instruo(es) do programa
(escopo global)

Podemos criar alias para um namespace. Ex:

using Lista = System.Collections.ArrayList;
Lista lst = new Lista( );

O alias pode ser criado para outros namespaces e para
classes
using
Exemplo
using System;
using Empresa.Construcao;

class ExemploCasa
{
static void Main( )
{
Casa minhaCasa = new Casa( );
minhaCasa.janelaCasa.Abrir( );
minhaCasa.portaCasa.Abrir( );

}
}
namespaces
Dicas
Utilizar PascalCasing

Prefixo do nome da empresa

Utilizar plural quando necessrio

Evitar nomes de classes iguais a nome de namespaces

Exemplo:

NomeEmpresa.EstoqueLogistica
assembly
Conjunto de classes que interagem entre si

Um assembly pode conter vrias classes (lembrar do
modificador de acesso internal)

uma DLL

Reutilizvel, versionvel, seguro e auto-descritivo

Existem dois tipos de assemblies: privados e pblicos
assembly
Composto logicamente por:

Conjunto de tipos (classes) e recursos

Metadados (manifest)

Manifest composto por:

Identidade: nome, nmero de verso, cultura
(opcional) e uma chaves pblica (opcional)

Contedo: informaes sobre o contedo do
assembly

Dependncias: dependncias do assembly
assembly
Exemplo
using System;

class Calculadora
{
public int Soma( int num1, int num2 )
{
return ( num1 + num2 );
}
public int Subtracao( int num1, int num2 )
{
return ( num1 - num2 );
}
}
version
Cada assembly possui um nmero de verso
como parte de sua identidade

O nmero de verso de um assembly
composto e quatro partes:

<major version>.<minor version>.<build number>.<revision>

Exemplo:

1.5.1254.0




Operadores,
delegaes e eventos
Operadores
Os operadores em C# so mtodos especiais

Possuem sintaxe diferente para clareza

Existem uma srie de operadores pr-definidos

Podem ser utilizados em classes e estruturas

O mesmo operador pode possuir comportamento
diferente dependendo do tipo de dado (o operador +
por exemplo)
Operadores Pr-Definidos
Categoria Operador
Aritmtico +, -, *, /, %
Lgico &, |, &&, ||, !, ^, true, false
Concatenao de string +
Incremento e decremento ++, --
Relacional ==, !=, <, >, <=, >=
Atribuio =, +=, -=, *=, /=, %=
Acesso a membros .
Indexao [ ]
Converso ( )
Condicional ?:
Concatenao e remoo de delegaes +, -
Criao de objetos new
Informaes de tipo is, sizeof, typeof
Controle de excees do tipo de overflow checked, uncheck
Indireo e endereamento *, ->, [ ], &
Sobrecarga de Operadores
Podemos sobrecarregar os operadores (assim como
mtodos) para operaes com nossas classes e
estruturas

Nem todos os operadores podem ser sobrecarregados:

Operadores aritmticos, lgicos e binrios podem ser
sobrecarregados livremente

O operador de atribuio no pode ser diretamente
Sobrecarga de Operadores
Sintaxe:

operatorop

op o operador que ser sobrecarregado

Devem ser mtodos pblicos e estticos

Devem seguir o padro operatorop

Sobrecarga de Operadores
Exemplo

public static decimal operator+( ContaCorrente conta1,
ContaCorrente conta2 )
{
return ( conta1.Saldo( ) + conta2.Saldo( ) );
}

public static decimal operator-( ContaCorrente conta1,
ContaCorrente conta2 )
{
return ( conta1.Saldo( ) - conta2.Saldo( ) );
}
Sobrecarga de Operadores
Relacionais
Sempre devem ser sobrcarregados em pares:
< e >
<= e >=
== e !=

Sobrecarregar o mtodo Equals quando sobrecarreg ==
e != (para efeitos de consistncia)

Sobrecarregar o mtodo GetHasCode se sobrecarregar o
mtodo Equals

Equals e GetHasCode so mtodos herados de objet

Sobrecarga de Operadores
Relacionais
Exemplo

public static bool operator>( ContaCorrente conta1,
ContaCorrente conta2 )
{
return ( conta1.Compare( conta2 ) > 0 );
}

public static bool operator<( ContaCorrente conta1,
ContaCorrente conta2 )
{
return ( conta1.Compare( conta2 ) < 0 );
}
Sobrecarga de Operadores
Converso
Podemos sobrecarregar operadores de converso
Explcitos ( paravara chave explicit)
Implcitos (palavra chave implicit)

Se a classe sobrecarregar um operador de converso de
string a classe deve tambm deve sobrecarregar o
mtodo ToString( )

Assim como mtodos, podemos sobrecarregar os
operadores vrias vezes, desde que tenham assinaturas
diferentes (paramtros)

Se um operador de converso puder gerar uma
exceo, defina-o como explcito
Sobrecarga de Operadores
Exemplo

public static decimal operator+( ContaCorrente conta1,
decimal valor )
{
return ( conta1.Saldo( ) + valor );
}
Delegaes
Delegaes permitir mtodos serem executados
indiretamente

Contm uma referncia para um mtodo de um objeto

Todos os mtodos de uma delegao devem ter a
mesma assinatura (parmetros e tipo de dado de
retorno)

Sintaxe semelhante a sintaxe de mtodos
Delegaes
Exemplo
public delegate void LigarBomba( );
...
class BombaEletrica
{
public void LigarBomaElerica( )
{
Console.WriteLine( "Ligar Bomba Eltrica" );
}
}
...
BombaEletrica be = new BombaEletrica( );
LigarBomba ligar new = LigarBomba(be.LigarBomaElerica);
ligar( );
Eventos
Baseado em delegaes

Esquema:

Publicador: provoca o evento para alertar objetos
interessados

Assinante(s): fornece um mtodo para ser executado
quando um evento for executado

Eventos
Exemplo
public delegate void LigarBomba( );
public event LigarBomba LigarBombas;

BombaEletrica be = new BombaEletrica( );
LigarBombas += new LigarBomba( be.LigarBomaElerica );

BombaMecanica bm = new BombaMecanica( );
LigarBombas += new LigarBomba( bm.LigarBombaMecanica );

LigarBombas( );
Eventos
Passagem de parmetros
Parmetros para eventos sempre devem ser
passados como EventArgs (ou derivados)

Mtodos disparados por eventos sempre
recebem dois parmetros: object (sender) e
uma referncia para um tipo EventArgs (ou
derivado) com informaes sobre o evento

Ver exemplo e WindowsApplication




Propriedades e
Indexadores
Objetivos
Utilizando propriedades
Utilizando indexadores
Propriedades
Utilizadas para acessar campos de uma classe onde
precisamos de processamento adicional antes de
modificar / recuperar o valor do campo

Possuem sintaxe semelhante a sintaxe dos campos

Podemos criar campos somente leitura / escrita
utilizando propriedades (atravs dos blocos get/set)

ideal que sejam utilizadas para acessos a campos
privados das classes

Podem utilizar virtual, override e abstract
Propriedades
Sintaxe:

[modificador acesso] [tipo de dado] [nome propriedade]
{
get
{
[cdigo]
return [nome do campo];
}
set
{
[cdigo]
[nome do campo] = value;
}
}
Propriedades
Exemplo
private string email;

public string EMail
{
get
{
return ( this.email );
}
set
{
this.email = value;
}
}
Propriedades
Dicas
Definir os campos da classe como privados

Utilizar propriedades para acessar esses campos

Faa isso principalmente para as classes de negcios
(mapeamento objeto relacional)

Gerar excees, quando necessrio, para o bloco SET
Indexadores
Transformam o objeto em uma matriz

Possuem sintaxe semelhante as propriedades

Utiliza a palavra chave this como nome e colchetes (da
mesma forma que uma matriz)

Os elementos podem ser acessados por uma chave
inteira (mais comum) e outros tipos de dados (mais
incomum/complexo)
Indexadores
Exemplo
public class Indexer
{
private string[] nomes;

public Indexer( int numNomes )
{
this.nomes = new string[ numNomes ];
}

public Indexer( ) : this( 1 )
{
}

public string this[ int posNome ]
{
get
{
return ( (string)this.nomes[ posNome ] );
}
set
{
this.nomes[ posNome ] = value;
}
}
}
Indexadores
Exemplo
public class MyCollection : CollectionBase
{
public string this[ int posNome ]
{
get
{
return ( (string)List[ posNome ] );
}
set
{
List[ posNome ] = value;
}
}

public void Add( string nome )
{
List.Add( nome );
}

public void Remove( string nome )
{
List.Remove( nome );
}
}




Atributos
Objetivos
Entender o que so atributos
Atributos
Um atributo uma classe que pode incluir dados
adicionais dentro de um assembly

Podem ser utilizados em qualquer membro da classes
(depende do atributo)

Pode ser utilizado para vrios propsitos:
Depurao
Fornecer informaes do assembly
Marcao de mtodos e classes como obsoletos
Compilao condicional
Acesso ao banco de dados
Definidos pelo usurio
Conditional
using System;
using System.Diagnostics;

class TestConditional
{
static void Main( )
{
TestConditional tc = new TestConditional( );

tc.TouchOnly( );
}

[Conditional("TOUCH")]
public void TouchOnly( )
{
Console.WriteLine( "S serei mostrado com a constante TOUCH
definida." );
}
}
Atributos
[Serializable]

[NonSerializable]

[WebMethod]

[STAThread]

[Obsolete]






Alguma Promessa
Pendente???





FIM

Anda mungkin juga menyukai