Você está na página 1de 39

Iniciando em C#

Este mdulo d uma viso geral do C#. ltima reviso: 10/07/2003 Pgina do projeto: http://tux.lcc.ufrn.br/~iuri/projeto

Criando o primeiro programa em C#


Abra seu editor de textos preferido e escreva o seguinte programa:

Compile e execute. Ao longo desse mdulo, ser descrito alguns aspectos deste primeiro programa. Observe a sada do programa:

Definindo uma classe


Classes so os ingredientes bsicos das linguagens orientadas a objetos. As classes em C# so declaradas com a palavra reservada class seguida do nome da classe e um bloco de comandos entre chaves. Nosso primeiro programa possua somente uma classe e seu nome era FirstCSharpClass. C#, como a maioria das linguagens orientadas a objetos, suporta mtodos e variveis membro. Observe a classe abaixo:

Esta classe possui trs mtodos e duas variveis membro. Possui o construtor Employee e dois outros mtodos getFirstName e getLastName, Classes e membros podem ter modificadores associados aos mesmos que definem sua visibilidade. Modificador de acesso public protected internal protected internal private (padro) Visibilidade Acessvel de qualquer lugar. Acessvel somente pela prpria classe ou qualquer classe derivada desta. Acessvel somente pelo programa em que foi declarada. Acessvel somente pela prpria classe ou qualquer classe derivada desta no mesmo programa. Acessvel somente pela prpria classe.

Indica que o mtodo no est associado static a nenhum objeto e chamado no (em mtodos) contexto da classe com a sintaxe

classe.mtodo em vez de objeto.mtodo

Voc no precisa se preocupar em fazer um destrutor para sua classe, pois a .NET CLR usa um coletor de lixo que automaticamente limpa a memria.

O ponto de entrada do programa, o mtodo Main


Todo programa em C# deve ter o mtodo Main, aqui alguns exemplos de declarao do mtodo Main: static void Main( string[] args ) static int Main( ) static int Main( string[] args ) Quando o programa executado, ele sempre chama o mtodo Main. O mtodo Main sempre declarado como static. Note que ele sempre declarado dentro de uma classe, isto sempre ser um mtodo. Em outras linguagens como C++, o ponto de entrada do programa sempre uma funo global. Funes globais no so permitidas em C#. O mtodo Main, pode obter os argumentos de linha de comando passados ao programa em forma de um vetor de strings. Em nosso primeiro programa, ns checamos se foram passados alguns argumentos: if (args.Length > 0 ) { [...] }

Aplicativos para console


Nosso primeiro exemplo um aplicativo para console, uma aplicao deste tipo, no tem um interface com o usurio(UI), no h caixas de opes, botes ou janelas. A entrada e a sada do texto vem do console, que no windows o prompt do MS-DOS. Aplicativos para console simplificam os exemplos dados nos mdulos.

Namespaces
Namespaces so usados em .NET para organizar as bibliotecas de classes em uma estrutura hierrquica, a .NET Framework SDK possui

diversos namespaces como System, System.Windows.Forms, System.IO, System.Web.Forms. O operador "." usado para separar namespaces que esto dentro de outros, como tambm usado para separar classes que esto contidas dentro de namespaces. Por exemplo, no namespace System.IO, temos uma classe chamada File, para criarmos uma instncia dessa classe devemos proceder assim: System.IO.File file = new System.IO.File(); Outra utilidade dos namespaces resolver os possveis conflitos de classes de mesmo nome.

A palavra reservada using


Voc pode estar pensando que vai escrever uma poro de cdigo para declarar um objeto, felizmente existe um atalho, a palavra reservado using. Voc pode criar uma nova instncia de uma classe desse jeito: using System.IO; File file = new File();

Mais sobre o operador "."


O operador . tambm usado para acessar um mtodo (o um dado) em uma classe (no caso do mtodo WriteLine() da classe Console) e para restringir uma classe a um especfico Namespace (como em System.IO.File, onde File exclusivamente uma classe do namespace System.IO), esta restrio para termos certeza que estamos chamando uma classe de certo namespace.

Adicionando comentrios
C# suporta 3 tipos diferentes de comentrios, comentrios de uma linha, comentrios de mltiplas linhas e comentrios de documentao de cdigo. Comentrios de uma linha comeam com // e tudo que estiver apos ele no ser interpretado at o final da linha. Comentrios de mltiplas linhas comeam com /* e terminam com */ e se expandem por mltiplas linhas, texto entre eles constituem um comentrio. exemplo de comentrios de uma linha:

// Atributo que contm o nome do usurio. public string usuario = "Joo Medeiros"; // Atributo que contem a idade do usuario. public int idade = 26; System.Console.WriteLine("Usuario: " + usuario); //escreve o nome do usuario System.Console.WriteLine("Idade: {0} anos", idade.ToString() ); Exemplo de comentrios de mltiplas linhas: /* O seguinte cdigo no executado, Console.WriteLine( hoje.ToString() ); */

Documentando seu cdigo


Comentrios que comeam com ///, constituem a documentao XML do seu cdigo. Documentando seu cdigo com este tipo de comentrio, o compilador pode gerar automaticamente toda a documentao para ser aproveitada por outras pessoas.

Tratamento de erros
Observando nosso primeiro programa exemplo, vemos que uma parte do cdigo foi declarada em um bloco try e outra parte em um bloco catch. Pois bem C# pois controle e tratamento de erro, todo cdigo que pode gerar um erro deve ser declarando num bloco try e caso este gere o erro, o cdigo declarado no bloco catch automaticamente chamado e executado.

Case-sensitive
C# case-sensitive, isto quer dizer que writeline no a mesma coisa de WriteLine, que no a mesma coisa de WRITELINE.

Variveis em C#
Este mdulo especifica como C# trata os tipo de dados da .NET Framework. ltima reviso: 21/07/2003 Pgina do projeto: http://tux.lcc.ufrn.br/~iuri/projeto

Tipos de variveis em .NET


Variveis so espaos na memria do computador que um programa usa para guardar algumas informaes que sero utilizadas por ele, so chamadas de variveis porque podem a qualquer momento mudar o contedo da informao guardada. Em .NET existem dois tipos de variveis, tipos por valor ou por referncia. Tipos por valor, so variveis que contm as informaes diretamente e tipos por referncia so variveis que contm informaes sobre onde um certo dado est armazenado. Quando voc chama uma varivel do tipo por valor ela devolve o dado real, diferente do tipo por valor, que devolve onde o dado est localizado na memria do computador e a partir da o programa acessa este endereo de memria e obtm o dado. Tabela de tipos por valor inclusos em C#:

Alguns tipos por referncia inclusos da .NET Framework:

Declarao de variveis
A declarao de uma varivel tem sempre a seguinte notao: Tipo NomeDaVarivel; Voc no obrigado a declarar suas variveis no incio de cada bloco. Nomes de variveis devem comear com uma letra ou um sublinhado("_") e podem conter nmeros, letras e sublinhado. Variveis em letras maisculas so diferentes de variveis de letras minsculas, nOmE e Nome so variveis diferentes. Nenhuma varivel pode ter o mesmo nome de uma palavra reservada da linguagem. Segue as palavras reservadas de C#:

Tipo Base
Todas as variveis em C# so objetos de alguma classe de tipos da .NET(veja a primeira tabela) e derivam da classe base object. Como todas as variveis so objetos, naturalmente elas possuem mtodos e propriedades: int x = 16; Console.WriteLine( x.ToString() );

Variveis inteiras
Variveis do tipo inteiro guardam dados numricos no fracionrios, isto , sem ponto decimal. Os tipos so: byte, sbyte, int, uint, long, ulong, short, ushort. Exemplos: sbyte num = 12; byte valor = 255; int valor = 123; uint resultado= 42024124386; long resultado = - 4445680; ulong matricula = 12312362532173421743; short index = 32767; ushort index = 65535;

Lgicos

So utilizados em comparaes e podem assumir verdadeiro ou falso(true ou false). Tipo: bool Exemplos: bool masculino = true; bool ativado = false;

Caracteres
Armazenam um caractere formato unicode. Tipo: char Exemplos: char CaractereY char CaractereY hexadecimal char CaractereY inteiro char CaractereY Unicode = 'Y'; = '\x0057'; // armazena Y // armazena Y usando seu valor

= (char) 87; // armazena Y convertido de um = '\u0057'; // armazena Y usando seu valor

Ponto flutuante
Armazenam nmeros reais. Observaes: As operaes envolvendo pontos flutuantes no geram excees: Uma operao com um resultado muito pequeno para ser representado torna-se zero Uma operao com um resultado muito positivo/negativo para ser representado produz um resultado +/- "infinito" Uma diviso por zero gera um resultado "infinito" Uma operao invlida gera como resultado um NaN(No um nmero - Not a Number). Se um dos operadores for um NaN, ento o resultado ser um NaN.

Resultado da diviso de 0 por 0 Tipos: double, float, decimal Exemplos: float x = 3.5; double y = 3; decimal z = 300.5;

Resultado da diviso de 3 por 0

String
Uma string pode conter at 1 gigabyte de caracteres e alocada dinamicamente. Tipo: string Exemplos: string FraseA = "Que dia "; string FraseB = "lindo"; Console.WriteLine( "Esta a minha frase: " + FraseA + FraseB );

Incializao de variveis
Todas as variveis so inicializadas automaticamente para um valor padro do tipo, normalmente zero.

Converses
Converter diferentes diferentes tipos de dados uma tarefa comum em programao, converter nmeros reais para inteiros, nmeros inteiros para reais, strings para nmeros, nmeros para strings. As converses podem ser automticas ou manuais. As converses automticas so feitas quando o tipo a receber o valor ( do lado esquerdo da atribuio) puder conter TODOS os possveis valores da expresso (do lado direito do operador de atribuio)

Converses chamando mtodos.


Voc pode utilizar de mtodos ao fazer suas converses de valores, elas so necessrias entre os seguintes tipos de dados: inteiro para string ponto flutuante para string string para inteiro string para ponto flutuante Para converter um inteiro ou um ponto flutuante para uma string basta chamar o mtodo .ToString(), exemplo: int x = 16; float y = 20; string meusNumeros = "Estes so meus nmeros: " + x.ToString() + " e " + y.ToString(); para converter uma string para inteiro ou um ponto flutuante chamamos o mtodo esttico .Parse(string s) do tipo de dado em questo, exemplo: Console.Write("Escreva um nmero: "); string temporario = Console.ReadLine(); int numero = int.Parse(temporario);

Converses com o operador de cast.


Para converter realizar converses em cast, voc chama o operador assim: (tipo) dado; Exemplo: int n = 16; double m = 15.6; double k = 14.4;

double y; y = (double) n; // y vale 16 y = (int) m; // y vale 15 y = (int) k; // y vale 14 y = (int) m + (int) k; // y vale 29 y = (int)( m + k ); // y vale 30

Checked
Se ao aplicarmos uma converso e o valor no couber no dado, no geramos um erro. Observe o seguinte cdigo int N; byte B; N = 10; // Esta converso funciona, pois 10 cabe em um byte B = (byte) N; N = 1000; // Esta converso no funciona, mas no gera erro B = (byte) N; Caso quisssemos que a converso gere uma exceo. Devemos coloc-la num bloco checked int N; byte B; N = 1000; checked { // Esta converso ir gerar uma exceo do tipo: "Number overflow". B = (byte) N; }

Sufixos
Sufixo so maneiras de garantir que constantes sejam de um certo tipo: Exemplos: // constantes do tipo long ou ulong long valor1 = 10L; ulong valor 2 = 10L;

// constantes do tipo uint ou ulong uint valor3 = 10u; ulong valor4 = 10u; // constantes do tipo ulong ulong valor5 = 10ul; ulong valor6 = 10LU; // constantes do tipo float float x = 10.7f; // constantes do tipo double double y = 100.704d; // constantes do tipo decimal; decimal d = 100.123312M;

Seqncias de escape em strings:


Seqncias de escape so utilizadas para representar caracteres que no possui representao no teclado ou que no so possveis o uso direto em strings.

Alm destas seqncias a seqncia \uNNNN, onde NNNN o cdigo unicode de um caractere.

Voc pode entretanto usar uma string iniciada por @, assim ela ir ignorar as seqncias de escape da string; Exemplos: string a = "c:\\windows\\command.com"; // a vale c:\windows\command.com string a = @"Numero1\nNumero2\n"; // a vale Numero1\nNumero2\n

Operadores
Os operadores disponveis em C#, so os seguintes e eles possuem a mesma funo que em C++:

Enum
Enum um tipo definido pelo usurio que associa nomes a nmeros pois fazem mais sentido para qualquer um ler o cdigo. Enums se comportam tanto como strings como inteiros. exemplo:

Struct
Permite declarar tipos que contm diversos valores identificados pelo nome. Como em C++, as estruturas podem ter mtodos e construtores. No possvel declarar um construtor que no aceite argumentos

New
Independente do tipo, todas as variveis podem ser inicializadas com o operador new. Exemplos: int N2 = new int(); bool Socio = new bool();

Arrays
Arrays so colees de um certo tipo de dados. So como matrizes com contm elementos que podem ser acessados em tempo de execuo.

Sempre que um array for declarado com um certo tipo, ele ser vlido para todos os itens do array. A declarao de um array sempre tem um [] depois do tipo da varivel. O array pode ter diversas dimenses, mas o primeiro ndice sempre zero. Todo array deve ser inicializado, e para qualquer ndice referenciado fora da faixa ser gerado uma exception. Um array de vrias dimenses pode ser declarado colocando vgulas dentro dos colchetes. Outra possibilidade declarar um array de outro array. exemplos: double[] Notas = new double[5]; int[] numeros = new int[100]; Notas[0] = 6; Notas[1] = 10; int[] a1; //uma dimenso int[,] a2; //duas dimenses int[,,] a3; //trs dimenses int[][] a4; // aninhamento, array de array int[][][] a5; //array de array de array int[] b1 = new int[] { 1, 2, 3}; int[,] b2 = new int[,] {{1,2,3}, {4,5,6}}; int[][] b3 = new int[3][]; b3[0] = new int[] { 1,2,3 }; b3[1] = new int[] { 4,5,6 }; b3[2] = new int[] { 7,8,9,10 }; int[] c1 = {1,2,3};

Blocos de cdigo
Neste mdulo voc ver blocos e instrues de seleo, de repetio, de desvio e de tratamento de erro. ltima reviso: 28/07/2003 Pgina do projeto: http://tux.lcc.ufrn.br/~iuri/projeto

Instrues
Um programa consiste em uma seqncia de instrues, quando o programa chamado, estas instrues so executadas uma aps a outra, como elas esto dispostas no programa, da esquerda para a direita, de cima para baixo.

Blocos
Quando voc desenvolve aplicaes em C#, voc precisa agrupar instrues como em outras linguagens de programao. Para isto, voc usa a sintaxe de linguagens como C, C++, Perl e Java, isto , voc agrupa suas instrues entre chaves: { e }. Voc no usa uma palavra para delimitar como If..End If do Microsoft Visual Basic. Um bloco pode conter um simples instruo, vrias instrues ou outro bloco. Cada bloco possui um escopo. Uma varivel declarada em um bloco chamada de varivel local. O escopo(validade) da varivel local se estende desde sua declarao at o } que finaliza o bloco que contm ela. Em C#, voc no pode declarar uma varivel em um bloco interno com o mesmo nome de uma varivel em um bloco externo. Exemplo: int i; { int i; // Erro: varivel j declarada no bloco pai. } Entretanto, voc pode declarar variveis do mesmo nome, em blocos paralelos. Blocos paralelos so bloco que ento contidos um mesmo bloco pai e esto no mesmo nvel. Exemplo: { int i; }

{ int i; } Voc pode declarar variveis em qualquer lugar em um bloco.

Blocos de seleo
As instrues if e switch so conhecidas como instrues de seleo. Eles fazem escolhas baseadas no valor das expresses e seletivamente executam outras instrues a partir das escolhas.

if...else
sintaxe: if ( Expresso-Boleana ) instruo/bloco-se-verdadeiro else instruo/bloco-se-falso Exemplos : if ( numero % 2 == 0 ) Console.WriteLine("Nmero par"); if (minutos == 60 ) { minutos = 0; horas ++; }

Convertendo inteiros para boleanos


Converses implcitas de inteiros para boleanos uma potencial fontes de bugs. Para evitar isto, C# no suporta converses de inteiros para boleanos . Esta uma diferena significante entre C# e outras linguagens similares, os exemplos seguintes so invlidos: int x; if (x) ... // Deveria ser x != 0 in C# if (x = valor()) ... //Deveria ser (x = valor) != 0 em C#.

switch
sintaxe: switch (expresso) { case valor1:

instrues; break; case valor2: instrues; break; case valor3: case valor4: instrues; break; case valor5: instrues; break; case valor6: instrues; goto case valor1; default: instrues; break; } A instruo switch executada assim: 1. Se uma das constantes especificadas em case igual ao valor da expresso, o controle transferido para a lista de instrues do case. 2. Se nenhum das constantes de cada case igual ao valor da expresso e o switch contm uma etiqueta default, o controle transferido para a lista de instrues dela. 3. Se nenhum das constantes de cada case igual ao valor da expresso e o switch no contm uma etiqueta default, o controle transferido para o fim do switch. Voc pode usar o comando switch com os seguintes tipos retorno de expresses: quaisquer valores inteiros, caracteres, um enum, ou uma string. Nota: Diferente de Java, C ou C++, o switch aceita o tipo string e o valor null permitido para uma constante de etiqueta do case.

Usando o comando break


Diferente de Java, C ou C++, C# no aceita uma transferncia de controle silenciosa para a prxima etiqueta de case, isto gera um erro ao se compilar o programa, em outras palavras voc deve sempre especificar uma regra para o final de cada case, as instrues que no geram erro so: a instruo break(a mais comum), a instruo goto(muito rara), a instruo return, a instruo throw, ou um loop infinito.

Blocos de repetio
As instrues while, do, for e foreach so conhecidas como instrues de interao. Voc deve us-las quando quer que certas operaes sejam executadas enquanto uma condio verdadeira.

while
O lao while o mais simples de todos os laos. Ele executa repetidamente as instrues internas enquanto (while, em ingls) uma expresso boleana verdadeira. Sintaxe: while ( expresso-boleana) instruo/bloco Ele executado como se segue: 1. A expresso boleana de controle do while avaliada. 2. Se a expresso for verdadeira o controle transferido para as instrues internas do while, quando executar todas as instrues o controle transferido novamente para o incio do while e a expresso novamente avaliada. 3. Se a expresso for falsa, o controle transferido para o fim a prxima instruo fora do while. Exemplos: while ( i < 10) Console.WriteLine(i++); while (true) Console.WriteLine("Lao infinito");

do
O lao do sempre vem junto de uma instruo while, ele muito similar ao lao while, exceto que a expresso boleana avaliada no final de cada interao. sintaxe: do instruo/bloco-de-cdigo while ( expresso boleana ); Ele executado como se segue:

1. O controle transferido para as instrues internas do do. 2. Quando forem executadas todas as instrues, a expresso boleana avaliada. 3. Se a expresso for verdadeira, o controle transferido ao incio do do. 4. Se a expresso for falsa o controle transferido para a primeira instruo aps o do. Exemplos: do Console.WriteLine(i++); while ( i < 10 ); do { Console.WriteLine(i); i++; } while ( i < 10 );

for
Quando usamos o lao while, desenvolvedores podem esquecer de atualizar o contedo da varivel de controle, como no cdigo seguinte: int i = 0; while ( i < 10 ) Console.WriteLine(i); // isto gera um lao infinito, // pois i no muda Voc pode minimizar os erros usando um lao for. O lao for contorna este problema movendo o cdigo de atualizao e inicializao para o incio do lao, onde mais difcil de se esquecer. Sintaxe: for ( inicializao; condio; atualizao) instruo/bloco esta sintaxe idntica ao seguinte cdigo: inicializao while (condio) { instruo/instrues atualizao } exemplos:

for ( ; ; ) { Console.WriteLine("Lao infinito"); } for (int i = 0; i < 10; i++) Console.WriteLine(i); for (int i = 0; i < 10; i++){ Console.WriteLine(i); Console.WriteLine(10 - i); }

foreach
A .Net Framework contm vrias classes de colees no namespace System.Collections, uma destas classes de colees a ArrayList. Voc pode usar um ArrayList para criar uma coleo de variveis e adicionar elementos a ela. Observe o seguinte cdigo: ArrayList numeros = new ArrayList(); for (int i = 0; i < 10; I++) { numeros.Add(i); } mostrando cada elemento depois: for (int i = 0; i < numeros.Count; i++) { int numero = (int) numeros[i]; Console.WriteLine(numero); } Mas voc pode melhorar este cdigo usando o loop foreach. O loop foreach permite que voc interaja com cada elemento de uma lista a cada loop. Sintaxe: foreach (Tipo varivel-receptora in coleo) instruo/bloco O loop foreach atribui varivel -receptora um valor da coleo a cada interao do lao enquanto houver elementos na coleo que no foram atribudos a varivel-receptora. exemplo: foreach (int numero in numeros) Console.WriteLine(numero);

Diferente de Perl, em C# voc no pode modificar os elementos em uma coleo usando um foreach porque a varivel de interao implicitamente declarada como readonly. foreach (int numero em numeros) { numero++; //Erro em tempo de compilao Console.WriteLine(numero); }

Instrues de desvio
As instrues goto, break e continue so conhecidas como instrues de desvio. Voc usa elas para transferir o controle de um ponto para outro do programa.

goto
Esta instruo a mais primitiva instruo de desvio em C#, ela transfere o controle para uma etiqueta. A etiqueta deve existir e estar no mesmo escopo da instruo goto. Mais de um goto pode transferir o controle para uma mesma etiqueta. Exemplo: if ( (numero % 2) == 0 ) goto Par; Console.WriteLine("mpar"); goto Fim; Par: Console.WriteLine("Par"); Fim: O goto pode transferir o controle para fora de um bloco, mas nunca pode transferir o controle para dentro de um bloco. A instruo goto e a etiqueta alvo devem ficar a parte do cdigo, pois podem facilmente obscurecer a lgica de fluxo em programa, esta uma razo dos livros de programao no recomendarem o uso do goto. As nicas situaes onde o goto recomendado na instruo switch ou para transferir o controle para o incio de um lao, a fim de repetir a interao sem passar para a prxima, funcionando como o comando redo de Perl.

break e continue
O break consiste em parar um lao ou sair de um switch. O continue inicia uma nova interao de um lao. Exemplo:

int i = 0; while (true) { Console.WriteLine(i); i++; if ( i < 10) continue; else break; Console.WriteLine("esta instruo nunca chamada"); } O break e o continue no so muito diferentes de um goto, pois podem obscurecer o fluxo lgico do programa. O mesmo cdigo acima pode ser reescrito assim: int i = 0; while ( i < 10 ) { Console.WriteLine(numeros[i]); i+=; }

Excees
Como programador, voc as vezes perde muito mais tempo procurando por erros e corrigindo-os do que pensando na lgica do programa. Nas linguagens procedimentais voc freqentemente mistura tratamento de erro com a lgica do programa. Exemplo: using System; class Teste { public static int Main() { // lgica do programa string entrada; int numero1, numero2; Console.Write("Insira um numero: "); entrada = Console.ReadLine(); numero1 = int.Parse(entrada); Console.Write("Insira outro numero: "); entrada = Console.ReadLine(); numero2 = int.Parse(entrada); //misturando tratamento de erros if (numero2 == 0) { Console.WriteLine("No posso dividir por 0"); return(1); } // continuando a lgica do programa Console.WriteLine("O resultado da divisao {0} ",

numero1 / numero2 ); return(0); } }

Tratando erros
sintaxe: try { cdigo-que-pode-gerar-um-erro } catch { rotina-de-tratamento-de-erro } Sempre que ocorrer um erro na execuo do cdigo entre try{ e }, a .Net Framework chama catch. Exemplo: using System; class Teste { public static int Main() { // lgica do programa string entrada; int numero1, numero2; Console.Write("Insira um numero: "); entrada = Console.ReadLine(); numero1 = int.Parse(entrada); Console.Write("Insira outro numero: "); entrada = Console.ReadLine(); numero2 = int.Parse(entrada); try { Console.WriteLine("O resultado da diviso {0} ", numero1 / numero2 ); return (0); } // tratamento de erro catch { Console.WriteLine("Ocorreu um erro de diviso"); return(1); } } } o cdigo antigo ainda pode gerar um erro na converso de string para inteiro, ento podemos reescrev-lo assim:

using System; class Teste { public static int Main() { string entrada; int numero1, numero2; Console.Write("Insira um numero: "); entrada = Console.ReadLine(); try { numero1 = int.Parse(entrada); } catch { Console.WriteLine("Converso invlida"); } Console.Write("Insira outro numero: "); entrada = Console.ReadLine(); try { numero2 = int.Parse(entrada); } catch { Console.WriteLine("Converso invlida"); } try { Console.WriteLine("O resultado da diviso {0} ", numero1 / numero2 ); return (0); } catch { Console.WriteLine("Ocorreu um erro de diviso"); return(1); } } } mas fazendo isto estaramos misturando a lgica com o tratamento de erros, voc poderia ento fazer assim: using System; class Teste { public static int Main() { // lgica do programa try { string entrada; int numero1, numero2; Console.Write("Insira um numero: "); entrada = Console.ReadLine(); numero1 = int.Parse(entrada);

Console.Write("Insira outro numero: "); entrada = Console.ReadLine(); numero2 = int.Parse(entrada); Console.WriteLine("O resultado da diviso {0} ", numero1 / numero2 ); return (0); } // tratamento dos erros catch { Console.WriteLine("Ocorreu um erro"); return(1); } } } Mas escrevendo-o desse jeito, um erro ocorrre e o usurio no sabe por que erro ocorreu. Para contornar isto voc pode usar mltiplos catch's, cada um tratando de erro especfico: using System; class Teste { public static int Main() { // lgica do programa try { string entrada; int numero1, numero2; Console.Write("Insira um numero: "); entrada = Console.ReadLine(); numero1 = int.Parse(entrada); Console.Write("Insira outro numero: "); entrada = Console.ReadLine(); numero2 = int.Parse(entrada); Console.WriteLine("O resultado da diviso {0} ", numero1 / numero2 ); return (0); } // tratamento dos erros catch (FormatException) { Console.WriteLine("Nmero invlido"); return(1); } catch (DivideByZeriException) { Console.WriteLine("No posso dividir por zero"); return(1); }

} } Os blocos try e catch so usados para tratar de erros gerados por programas em C#. Ao invs de setar variveis globais para conter erros, as rotinas de C# lanam excees que so transferidas para uma apropriada instruo catch.

Gerando excees
Quando precisamos gerar um exceo chamamos uma instruo throw. Isto imediatamente suspende a execuo normal de um programa e o controle transferido para o primeiro catch que pode tratar da exceo. Exemplo: if (minutos < 0 || minutos >= 60) { string erro = minutos + " no um minuto vlido"; throw new InvalidTimeException(erro); } Neste exemplo, a instruo throw usada para gerar um exceo definida pelo programador, InvalidTimeException, se o minutos passados no forem minutos vlidos, a mensagem passada no argumento da exceo mostrada. Liberando recursos C# tambm possui uma clusula finally a fim de se executar instrues ao final de um fluxo terminado normalmente ou terminado com um erro, isto pode ser muito til por exemplo para fechar arquivos ou desconectar banco de dados ao final de um bloco, ou para evitar a duplicao de instrues entre o bloco try e o bloco catch.

Documentao XML
Este mdulo descreve algumas tags da documentao de cdigo em C#. ltima reviso: 13/07/2003 Pgina do projeto: http://tux.lcc.ufrn.br/~iuri/projeto

Os comentrios de documentao ///


Voc tem o costume de documentar seus cdigos? Com certeza no uma tarefa muito apreciada pelos desenvolvedores, sendo que custa muito dinheiro para criar e principalmente documentar devido ao tempo gasto. Mas, se voc for pensar assim, quando precisar realizar uma manuteno em um cdigo, ter de vasculhar todos os vnculos, desvios, enfim, tudo o que implica no respectivo cdigo. Para isso, a Microsoft criou uma forma de documentao automtica, adotando o padro XML. Assim, qualquer estrutura de cdigo pode seguir as regras que o XML se encarrega de exibir. Estamos falando aqui de uma simples documentao de cdigos, no de fluxo de informaes de um aplicativo. Voc pode inserir qualquer comentrio no cdigo, inserindo as ///(trs barras), e com isso o programa XML saber do que se trata.

H tags XML que so sugeridas para serem usadas(voc tambm pode criar as suas), veja algumas:

<summary> [...] </summary>


Para uma descrio rpida.

<remarks> [] </remarks>
Para uma descrio detalhada, esta tag pode conter pargrafos, listas e outros tipos de tags.

<para> [...] </para>


Esta tag permite pargrafos em uma estrutura <remarks>

<example> [...] </example>


Para demonstrar um exemplo de um mtodo, propriedade ou como um membro deve ser usado, utilize com a tag <code>.

<code> [...] </code>


Para indicar que o texto seguinte cdigo de aplicativo.

<seealso cref="membro" />


Para indicar uma referencia a outro membro ou campo, o compilador checa se de fato o "membro" existe.

<param name="nome"> [] </param>


Para prover uma descrio para um parmetro de um dado mtodo.

<returns> [] </returns>
Para documentar um valor de retorno e um tipo de mtodo.

<value> [] </value>
Para descrever uma propriedade.

A classe System.Console
Este mdulo d explica como usar a classe System.Console para leitura e escrita em consoles, a classe apresentada em C#, mas pode este documento pode facilmente ser estendido para outras linguagens .NET ltima reviso: 13/07/2003 Pgina do projeto: http://tux.lcc.ufrn.br/~iuri/projeto

Mtodos Write e WriteLine

Console.Write e Console.WriteLine escrevem informaes na tela do console WriteLine gera uma nova linha. Ambos os mtodos so sobrecarregados. Uma string de formato e parmetros podem ser usados para: Formatar texto. Formatar nmeros.

Voc pode usar Console.Write e Console.WriteLine para mostrar informaes na tela de console. Estes dois mtodos so muito similares, a diferena principal que WriteLine inclui um caractere de nova linha no final da sada e Write no faz isto. Ambos os mtodos so sobrecarregados, voc pode cham-los com variveis numricas ou strings. Por exemplo voc pode usar o seguinte cdigo para escrever "99" na tela: Console.WriteLine(99); Voc pode usar o cdigo seguinte para escrever a mensagem "Oi vocs" na tela: Console.WriteLine("Oi vocs");

Formatando Textos
Voc pode usar as formas poderosas de Write e WriteLine que pegam uma string de formato e parmetros adicionais. A string de formato especifica como os dados iram para a sada, e ela contm marcadores que so substitudos em ordem pelos parmetros que se seguem, por exemplo:

Console.WriteLine("A soma de {0} com {1} igual a {2}", 147, 68, 147+48); que retorna: "A soma de 127 com 68 igual a 195" obs: O primeiro parmetro da string de formato sempre referido como parmetro zero: {0} Voc pode usar os parmetros string de formato para especificar quantos caracteres devem ser usados e se estes devem ser justificados a esquerda ou a direita, observe os cdigos: Console.WriteLine("Justificado a esquerda e com tamanho 10: {0,-10}", "oi"); Console.WriteLine("Justificado a direita e com tamanho 10: {0,10}", 99); este cdigo retorna as seguintes strings, respectivamente: "Justificado a esquerda e com tamanho 10:oi "Justificado a direita e com tamanho 10: " 99"

Formatando Nmeros
Voc pode tambm usar a string de formato para especificar com os dados numricos sero formatados, a sintaxe completa : {N,M:StringDeFormato}, onde N ]e o parmetro M serve para ditar o tamanho do campo e se ele deve ser justificado a direita ou a esquerda, e StringDeFormato especifica como o dado numrico ser mostrado. Observe a tabela, em todos os formatos o nmero de dgitos a serem mostrados, ou arrendondados, pode opcionalmente ser especificado. Tipo Significado Mostra em formato de moeda utilizando a C localidade setada como padro. D Mostra um numero como um inteiro E Escreve em notao cientfica Mostra com um ponto fixo separando parte inteira e F parte decimal Mostra o texto com um inteiro, ponto fixo ou G notao cientfica, dependendo de qual deles mais compacto Mostra o nmero com separadores de milhares, N milhes, etc.

Mostra o nmero em hexadecimal

Exemplos: Console.WriteLine("Formato de moeda atual- {0:C} {1:C4}", 88.8, -888.8); Console.WriteLine("Formato de Inteiro - {0:D5}", 88); Console.WriteLine("Notao cientfica - {0:E}", 888.8); Console.WriteLine("Com ponto fixo - {0:F3}",888.8888); Console.WriteLine("Formato geral - {0:G}", 888.8888); Console.WriteLine("Formato numrico - {0:N}", 8888888.8); Console.WriteLine("Formato Hexadeciaml - {0:X4}", 88); Sadas: Formato de moeda - $88.800000000000000 ($888.8000) Formato de Inteiro - 00088 Notao cientfica - 8.888000000000000E+002 Com ponto fixo - 888.889 Formato geral - 888.8888 Formato numrico atual - 8,888,888.800000000000000 Formato Hexadeciaml - 0058

Mtodos Read e ReadLine

Console.Read e Console.ReadLine lem a entrada do usurio. Read l o prximo caractere. ReadLine l at o final da linha.

Voc pode obter uma entrada vinda do teclado usando os mtodos Console.Read e Console.ReadLine

O mtodo Read
Read l o prximo caractere da entrada padro (teclado), ele retorna um inteiro contendo o nmero do caractere do formato Unicode, se no houver mais entrada a ser lida, ele retorna -1.

O mtodo ReadLine
ReadLine l todos os caracteres at chegar no final da linha, ele retorna uma string com os caracteres lidos. Observe o cdigo seguinte, ele l uma linha do teclado e em seguida a mostra na tela.

string input = Console.ReadLine( ); Console.WriteLine("{0}", input);