Você está na página 1de 55

Como Programar com

ASP.NET e C#
Segunda edio
Revisado e atualizado para a verso 4.0
Alfredo Lotar
Novatec
Copyright 2007, 2010 da Novatec Editora Ltda.
Todos os direitos reservados e protegidos pela Lei 9.610 de 19/02/1998.
proibida a reproduo desta obra, mesmo parcial, por qualquer processo, sem prvia autorizao,
por escrito, do autor e da Editora.
Editor: Rubens Prates
Editorao eletrnica: Camila Kuwabata e Carolina Kuwabata
Reviso gramatical: Gabriela de Andrade Fazioni
Capa: Rodolpho Lopes
ISBN: 978-85-7522-249-4
Histrico de impresses:
Outubro/2010 Segunda edio
Agosto/2008 Primeira reimpresso
Julho/2007 Primeira edio (ISBN: 978-85-7522-121-1)
Novatec Editora Ltda.
Rua Lus Antnio dos Santos 110
02460-000 So Paulo, SP Brasil
Tel.: +55 11 2959-6529
Fax: +55 11 2950-8869
Email: novatec@novatec.com.br
Site: www.novatec.com.br
Twitter: twitter.com/novateceditora
Facebook: facebook.com/novatec
LinkedIn: linkedin.com/in/novatec
Dados Internacionais de Catalogao na Publicao (CIP)
(Cmara Brasileira do Livro, SP, Brasil)
Lotar, Alfredo
Como programar com ASP.Net e C# / Alfredo Lotar.
-- 2. ed. -- So Paulo : Novatec Editora, 2010.
Bibliografia.
ISBN 978-85-7522-249-4
1. ASP.NET 2. Active Server Pages 3. C#
(Linguagem de programao para computadores)
I. Ttulo.
07-5124 CDD-005.133
ndices para catlogo sistemtico:
1. ASP.NET : Linguagem de programao :
Computadores : Processamento de dados
005.133
2. C# : Linguagem de programao :
Computadores : Processamento de dados
005.133
ORG20101013
27
CAPTULO 1
Introduo ao C# e .NET Framework
O .NET Framework um componente integrado ao Windows que d suporte exe-
cuo e ao desenvolvimento de uma nova gerao de aplicaes e XML web services.
Segundo a documentao, o .NET Framework foi projetado com os seguintes objetivos:

Oferecer um ambiente consistente de programao orientado a objetos, de modo
que o cdigo do objeto seja armazenado e executado localmente, mas com a
possibilidade de ser armazenado na internet e executado de forma remota.

Oferecer um ambiente de execuo de cdigo que minimiza o desenvolvimento
de software e conitos de verses.

Oferecer um ambiente que promove execuo segura de cdigos, inclusive os
criados por fontes desconhecidas.

Fornecer um ambiente de execuo de cdigo que elimine os problemas de
desempenho gerados por linguagens de script ou ambientes interpretados.

Aproveitar o conhecimento do programador em diferentes tipos de aplicaes,
como aplicaes Windows ou web.

Construir toda a comunicao em padres reconhecidos pela indstria para
que o .NET Framework possa se integrar com qualquer tipo de cdigo.
O .NET Framework tem dois componentes principais: o Common Language Runtime
(CLR) e o .NET Framework class library, que inclui o ADO.NET, o ASP.NET e o
Windows Forms.
Dica: se voc no se interessa muito por teoria sobre .NET, C# etc., ento pule para
o tpico 1.10.
1.1 Common Language Runtime (CLR)
o mecanismo responsvel pela execuo das aplicaes .NET Framework. O C#
suporta CLR, assim como outras linguagens de programao da Microsoft. O cdigo
gerado pelo compilador para o suporte CLR denominado cdigo gerenciado. O
Common Language Runtime (CLR) (linguagem comum em tempo de execuo)
o crebro do .NET Framework. Pense nele como o agente que gerencia o cdigo em
tempo de execuo, oferecendo servios, como o gerenciamento de memria. Veja os
benefcios que o CLR proporciona:
28 Como Programar com ASP.NET e C#

Gerenciamento automtico de memria.

Vericao de segurana de tipos.

Gerenciamento de excees.

Segurana aprimorada.

Acesso a metadados.
1.2 Class library biblioteca de classes
uma biblioteca de classes, interfaces e tipos includos no .NET Framework, que
permite acesso s funcionalidades do sistema, sendo a base a partir da qual so cons-
trudas aplicaes .NET, componentes e controles. Com essa biblioteca de classes,
podemos criar aplicaes que executam as mais variadas tarefas, como um software
de gesto empresarial, um editor de imagens semelhante ao Photoshop ou ainda
um website de comrcio eletrnico. As principais funcionalidades oferecidas pela
biblioteca de classes so:

Representa tipos de dados bsicos e excees.

Permite o encapsulamento das estruturas de dados.

Executa operaes de entrada e sada.

Acessa informaes sobre tipo de dados carregados.

Realiza vericaes de segurana.

Fornece acesso aos dados e internet.

Permite desenvolver a interface de uma aplicao.

Permite o desenvolvimento de aplicaes Windows e ASP.NET.
1.3 Linguagens suportadas
As linguagens da Microsoft suportadas pelo CLR so: Visual Basic e C#, Visual
C++, Jscript, F#, alm de linguagens desenvolvidas por outras empresas, como Perl
e COBOL.
Uma caracterstica interessante do CLR a interao entre as linguagens. Por exemplo,
podemos desenvolver um componente no Visual Basic e utiliz-lo com C#. Isso se torna
muito importante quando trabalhamos com equipes que dominam vrias linguagens
de programao. Cada programador pode trabalhar usando sua linguagem preferida
e, no nal, o projeto integrado como se tivesse sido criado em uma nica linguagem.
A integrao entre as linguagens facilita a vida de empresas e programadores que ad-
quirem ou vendem componentes. A linguagem em que o componente foi desenvolvido
irrelevante. A nica preocupao consiste em averiguar se foi desenvolvido em uma
29 Captulo 1

Introduo ao C# e .NET Framework


linguagem que suporte CLR. Pelo que tenho observado em websites de empresas
desenvolvedoras de componentes, C# a linguagem preferida para desenvolvimento
de componentes. Em alguns websites, encontramos a seguinte frase: Desenvolvido
100% em cdigo gerenciado C#.
1.4 Linguagem intermediria MSIL
Quando compilamos o cdigo gerenciado, geramos Microsoft Intermediate Language
MSIL, ou simplesmente IL, o qual independente de CPU e pode ser convertido
para cdigo nativo. O MSIL inclui instrues para carregar, armazenar, inicializar
e executar mtodos, assim como instrues para operaes aritmticas e lgicas,
controle de uxo etc.
O cdigo contido no MSIL no pode ser executado diretamente; antes, preciso
convert-lo para instrues que possam ser interpretadas pela CPU. A converso
realizada por um compilador just-in-time (JIT ou JITter).
O MSIL no necessita de plataforma, logo s precisamos de um compilador para con-
verter o cdigo MSIL em cdigo nativo na mquina-alvo. Alm disso, os metadados,
que representam informaes utilizadas pelo CLR, so colocados em um arquivo
chamado Portable Executable (PE), que pode ter a extenso DLL ou EXE.
1.5 Compilando MSIL para cdigo nativo
Antes de executar o MSIL, preciso utilizar o .NET Framework just-in-time (JIT) para
convert-lo para o cdigo nativo. Assim, geramos cdigo especco para a arquitetura
na qual roda o compilador JIT. Seguindo esse raciocnio, podemos desenvolver uma
aplicao e convert-la para vrias plataformas. Precisamos apenas converter o MSIL
para o cdigo nativo com um compilador JIT, especco para a plataforma desejada.
Cada sistema operacional pode ter seu compilador JIT. Claro que chamadas espe-
ccas a API do Windows no funcionaro em aplicaes que estejam rodando em
outro sistema operacional. Isso signica que devemos conhecer e testar muito bem
uma aplicao, antes de disponibiliz-la para mltiplas plataformas.
Em uma aplicao comercial grande, geralmente usamos um nmero limitado de
funes. Assim, algumas partes do cdigo dessa aplicao podem no ser executadas.
Visto que acarreta consumo de tempo e memria, a converso do MSIL para o cdigo
nativo realizada somente na primeira vez em que o cdigo executado. Por exemplo,
se o nosso programa compila um determinado mtodo, haver compilao somente
na primeira vez em que o mtodo for executado. As chamadas seguintes utilizaro
o cdigo nativo. O MSIL convertido usado durante a execuo e armazenado para
que esteja acessvel para chamadas subsequentes.
30 Como Programar com ASP.NET e C#
Imagine, por exemplo, que voc tenha uma classe com cinco mtodos; quando chamar
o primeiro mtodo, somente este ser compilado; quando precisar de outro mtodo,
este tambm ser compilado. Chegar um momento em que todo o MSIL estar em
cdigo nativo.
1.6 Assemblies
Os Assemblies so a parte fundamental da programao com .NET Framework, pois
contm o cdigo que o CLR executa. O cdigo MSIL dentro de um arquivo portable
executable (PE) no ser executado se no tiver um assembly manifest associado, e
cada assembly deve ter somente um ponto de entrada, exemplo: DllMain, WinMain
ou Main.
Um assembly pode ser esttico ou dinmico. Os assemblies estticos podem incluir
vrios tipos (interfaces e classes) do .NET Framework, como tambm recursos para
assemblies (bitmaps, arquivos .jpeg etc.). Os assemblies estticos so armazenados no
disco rgido com um arquivo portable executable. O .NET Framework cria assemblies
dinmicos que so executados diretamente da memria e no precisam ser armaze-
nados em disco. Podemos salvar em disco assemblies dinmicos aps sua execuo.
Um assembly pode ser criado usando o Visual Studio 2010 ou outras ferramentas
disponibilizadas pelo .NET Framework SDK. Esses assemblies dinmicos podem ser
criados com as classes da namespace System.Refection.Emit.
1.6.1 Assemblies benefcios
Assemblies foram projetados para simplicar o desenvolvimento de aplicaes e re-
solver problemas ocorridos pelo conito de verses causado pela instalao de uma
mesma DLL de verso diferente da usada pela aplicao atual. O conito entre as
DLLs um problema antigo do Windows e no ocorre com o .NET Framework, pois
cada aplicao tem suas prprias DLLs. Quando instalamos uma aplicao .NET, os
arquivos PE (DLL e EXE) cam no mesmo diretrio da aplicao, portanto podemos
ter diferentes verses da mesma DLL no computador.
1.6.2 Assembly contedo
Um assembly esttico compe-se de quatro partes:

Assembly manifest que contm o metadata do assembly.

Tipo metadata.

Cdigo MSIL que implementa os tipos.

Os recursos para assemblies (bitmaps, arquivos .jpeg etc.) e outros arquivos
necessrios para a aplicao.
31 Captulo 1

Introduo ao C# e .NET Framework


1.7 Metadata
O metadata descreve tipos e membros contidos em uma aplicao. Quando conver-
temos o cdigo C# em um Portable Executable (PE), o metadata inserido em uma
poro desse arquivo, enquanto o cdigo convertido para MSIL e inserido em outra
poro desse mesmo arquivo. Quando o cdigo executado, o metadata carregado
na memria, juntamente com as referncias para as classes, os membros, a herana etc.
O metadata armazena as seguintes informaes:

Descrio do assembly.

Identicao (nome, verso, cultura, chave pblica).

Os tipos que so exportados.

Outros assemblies das quais esse assembly depende.

Permisses de segurana necessrias para a execuo.

Descrio de tipos.

Nome, visibilidade, classe base e interfaces implementadas.

Membros (mtodos, campos, propriedades, eventos etc.).

Atributos.

Elementos descritivos adicionais que modicam tipos e membros.
1.8 Manifest
Todo assembly, esttico ou dinmico, contm uma coleo de dados que descrevem
como os elementos em um assembly se relacionam uns com os outros. O assembly
manifest contm todo o metadata necessrio para o assembly denir verso, identi-
car aspectos relativos segurana e referncias para recursos e classes. O manifest
pode ser armazenado junto com o MSIL no PE (.dll ou .exe) ou em um PE separado.
Observe os tipos de assemblies na gura 1.1:
Figura 1.1 Tipos de assemblies.
32 Como Programar com ASP.NET e C#
1.9 Garbage collector coletor de lixo
um mecanismo que descarta, de forma automtica, os objetos que no so mais
utilizados por uma aplicao. Isso deixa o programador mais tranquilo, j que no h
preocupao com o gerenciamento de memria da aplicao. O CLR detecta quando
o programa no est mais usando um objeto e o recicla automaticamente.
1.10 C# a linguagem de programao
C# (lembrando que se l C Sharp) uma linguagem de programao simples, porm
poderosa e ao mesmo tempo ideal para desenvolver aplicaes web com ASP.NET.
uma evoluo do C e C++. O C# uma linguagem orientada a objetos com a qual
podemos criar classes que podem ser utilizadas por outras linguagens, por exemplo,
o Visual Basic. Uma caracterstica importante o fato de ainda ser possvel utilizar os
componentes COM, facilitando assim uma rpida migrao para um ambiente de de-
senvolvimento de alto nvel sem precisar reescrever todas as aplicaes que voc possui.
A sintaxe utilizada pelo C# relativamente fcil, o que diminui o tempo de aprendiza-
do. Depois que voc entender como funciona, no ter mais motivos para utilizar outra
linguagem complicada, pois ela tem o poder do C++ e simples como o Visual Basic.
Por ser uma linguagem orientada a objeto, existe a capacidade de uma classe herdar
certas caractersticas ou mtodos de outras classes, sejam elas escritas em C# ou em VB.
Todos os programas desenvolvidos devem ser compilados, gerando um arquivo com
a extenso DLL ou EXE. Isso torna a execuo dos programas mais rpida se compa-
rados com as linguagens de script (VBScript, JavaScript). Nosso primeiro programa
C# extremamente simples. O programa deve exibir na tela Ol mundo.
Baixe e instale no seu computador o .NET Framework 4.0 e o Visual Studio 2010 ou
o Visual Web Developer 2010 Express.
http://www.microsoft.com/netframework
http://www.microsoft.com/visualstudio
http://www.microsoft.com/express/Downloads
Obs.: nos arquivos de exemplo, voc encontra uma lista com todos os links
indicados no livro. Assim no h necessidade de digit-los.
Em seguida, digite as linhas a seguir no bloco de notas do Windows.
namespace OlaMundo {
class Ola {
static void Main() {
System.Console.WriteLine("Ol Mundo!");
}
}
}
33 Captulo 1

Introduo ao C# e .NET Framework


Salve o arquivo como: c:\livro\capitulo1\OlaMundo.cs.
Uma dica: crie um diretrio livro e, em seguida, um subdiretrio para cada captulo
do livro. Isso facilitar a localizao e a execuo dos exemplos deste livro.
Em seguida, utilize o Visual Studio Command Prompt: v ao menu Iniciar Programas
Microsoft Visual Studio 2010 Visual Studio Tools Visual Studio Command Prompt (2010).
Veja a gura 1.2:
Figura 1.2 Visual Studio Command Prompt (2010).
Mude o diretrio atual. No Visual Studio Command Prompt (2010), digite:
cd c:\livro\capitulo1
Em seguida, digite:
csc OlaMundo.cs
Nesse momento, voc est convertendo o cdigo C# em linguagem intermediria
(MSIL) e gerando um arquivo Portable Executable (PE) do tipo .exe, conforme a
gura 1.3:
Figura 1.3 Compilando o programa OlaMundo.
Se tudo estiver correto e no houver erro de sintaxe, aparecer apenas uma mensagem
contendo a verso do compilador C# e as informaes sobre copyright. Se houver
algum erro, ser retornada uma mensagem informando a linha em que est o erro.
Execute o programa digitando OlaMundo. O programa em execuo pode ser visto na
gura 1.4:
34 Como Programar com ASP.NET e C#
Figura 1.4 Programa executado com sucesso.
O exemplo de compilao visto anteriormente a forma mais simples que existe, pois
no especicamos o local nem o nome do arquivo executvel que estamos gerando,
cujo nome pode ser denido conforme o exemplo que segue:
csc /out:c:\saida.exe OlaMundo.cs
Se voc quiser ver as opes de compilao que podem ser utilizadas em C#, digite
apenas csc /? na linha de comando, conforme mostra a gura 1.5.
Se preferir, use o Visual Studio 2010. No menu File, Selecione New Project.... Em seguida,
clique em Console Application e em OK. Observe a gura 1.6.
Figura 1.5 Parmetros do comando csc.
Digite as linhas a seguir no mtodo Main:
System.Console.WriteLine("Ol Mundo!");
System.Console.Read();
Exemplo:
static void Main(string[] args) {
System.Console.WriteLine("Ol Mundo!");
System.Console.Read();
}
35 Captulo 1

Introduo ao C# e .NET Framework


No Visual Studio 2010, depois de digitar o cdigo anterior, pressione F5.
Figura 1.6 Janela New Project do Visual Studio 2010.
1.10.1 Comentrios
Usamos comentrios para descrever partes complexas de cdigo, a m de facilitar a
manuteno tanto de quem elaborou o software quanto de terceiros. Comentrios
no so interpretados pelo compilador C#. Podemos denir como um comentrio:
textos, caracteres especiais, trechos de cdigo, nmeros etc.
O C# permite denir comentrios de duas maneiras: usando barras duplas (//) ou
os caracteres /* e */.
Barras duplas (//) convertem o restante da linha em comentrios:
// Nosso primeiro programa C#
Os caracteres /* e */ denem blocos de texto como comentrios. Exemplo:
/*Este meu primeiro contato com C#.
Espero que aprenda rpido essa nova linguagem de programao.
Obrigado! */
1.10.2 Mtodo Main
Um programa C# deve conter um mtodo Main, que controla o incio e o m e possi-
bilita que sejam criados objetos e que outros mtodos sejam executados. Um mtodo
Main pode no retornar valores:
36 Como Programar com ASP.NET e C#
static void Main() {
// ...
}
ou retornar um valor inteiro (int):
static int Main() {
// ...
return 0;
}
Com ambos os tipos (void ou int), o mtodo Main pode conter parmetros:
static void Main(string[] args) {
// ...
}
ou
static int Main(string[] args) {
// ...
return 0;
}
Para executar o programa, basta separar os argumentos com espaos. No Visual Studio
Command Prompt (2010), digite:
NomeDoPrograma A 2 10
Sendo que A, 2 e 10 so os valores passados ao programa.
1.10.3 Sintaxe C#
Todas as instrues devem estar entre chaves e sempre ser nalizadas com um ponto
e vrgula, como voc ver a seguir:
{
// Cdigo aqui;
}
Exemplo:
if (1>2) {
// Cdigo aqui;
}
Alm disso, o C# sensvel a letras maisculas e minsculas, ou seja, Main no o
mesmo que main. No observar esse detalhe impossibilita a execuo do programa.
1.10.4 Entrada e sada
A entrada e a sada de um programa C# so realizadas pela biblioteca de classes do
.NET Framework. A instruo System.Console.WriteLine("Ol Mundo!"); utiliza o mtodo
WriteLine da classe Console. No se preocupe se alguns termos so desconhecidos,
37 Captulo 1

Introduo ao C# e .NET Framework


exemplo: classe, mtodo, namespace, diretiva etc. Neste captulo, todos esses termos
sero explicados e exemplicados.
Alerta: neste livro, para facilitar a explicao de um bloco ou uma linha de cdigo,
no inserimos junto com o cdigo uma classe e um mtodo Main, ou seja, o cdigo
no est pronto para a execuo.
Algumas linhas de cdigo podem aparecer em linha nica:
Console.WriteLine(i.ToString());
Ou em bloco:
for (int i = 10; i >= 1; i--) {
Console.WriteLine(i.ToString());
}
Para executar esse cdigo, voc precisa criar uma classe e um mtodo Main e compil-lo.
Exemplo:
class Teste {
static void Main() {
for (int i = 10; i >= 1; i--) {
Console.WriteLine(i.ToString());
}
}
}
Em caso de dvida, use como referncia o cdigo nos arquivos de exemplo do livro.
1.10.5 Estrutura de um programa C#
Um programa C# consiste em um ou mais arquivos. Cada arquivo pode conter zero
ou mais namespaces. Uma namespace (espao para nome) pode conter tipos, como
classes, estruturas (structs), interfaces, enumeraes, e outras namespaces. A seguir,
temos um programa simples listado na documentao do .NET Framework que
contm todos esses elementos:
using System;
namespace NossaNamespace {
class NossaClass {
}
struct NossaStruct {
}
interface INossaInterface {
}
delegate string NossoDelegate();
enum NossoEnum {
}
38 Como Programar com ASP.NET e C#
namespace OutraNamespace {
struct OutraStruct {
}
}
class ClasseMain {
static void Main(string[] args) {
// Cdigo de inicializao do programa
}
}
}
1.10.6 Variveis
As variveis so utilizadas para armazenar informaes na memria do computador,
enquanto o programa C# est sendo executado. As informaes contidas nas variveis
podem ser alteradas durante a execuo do programa.
As variveis devem conter um nome para que a elas possam ser atribudos valores.
Alm do nome, devemos tambm denir o tipo de dados e o escopo (local em que a
varivel estar acessvel). O escopo denido pelos modicadores de acesso.
Ao nomear uma varivel, devemos observar as seguintes restries:

O nome deve comear com uma letra ou _.

No so permitidos espaos, pontos ou outros caracteres de pontuao, mas
podemos usar nmeros.

O nome no pode ser uma palavra reservada do C#. Exemplo: if, this, while etc.

O nome deve ser nico dentro do contexto atual.


A sintaxe utilizada para declarar uma varivel :
Tipo nome;
Exemplo:
string nome;
int idade=50;
O tipo de dados tambm pode ser denido de forma implcita. Voc escreve a palavra-
chave var, e o C# dene o tipo. O tipo annimo nomeado do lado esquerdo da
igualdade, sendo determinado pelo operador do lado direito da igualdade.
Observe os exemplos a seguir, em que a varivel i compilada como um tipo int.
var i = 5;
A varivel str compilada como uma string,
var str = "Ol mundo!";
39 Captulo 1

Introduo ao C# e .NET Framework


Ao usar a palavra-chave var, devemos observar as seguintes restries:

A palavra-chave var pode ser usada somente com variveis declaradas e inicia-
lizadas na mesma instruo; a varivel no pode ser inicializada como null.

No pode ser usada para declarar campos.

No pode ser usada na inicializao de expresses.

No possvel inicializar mltiplas variveis na mesma instruo.
Obs.: no confundir a palavra-chave var com os tipos variantes do Visual Basic 6.
Os tipos de dados denem a quantidade de memria que ser reservada para a varivel.
Obs.: as variveis devem ser nomeadas levando-se em conta as tarefas que
descrevem. Alm disso, os nomes devem ser curtos para que possam ser facilmente
digitados.
O C# 4.0 tem um novo tipo, dynamic. Um tipo dynamic ignora as vericaes de tipo
em tempo de compilao. Essas operaes so realizadas em tempo de execuo. Ou
seja, um tipo dynamic existe somente em tempo de compilao e no em tempo de
execuo. Caractersticas teis no acesso a APIs do Ofce, bibliotecas do IronPython
e do HTML Document Object Model (DOM).
Para declarar uma varivel, muito simples.
Exemplo:
dynamic dyn = 10;
dynamic s = "Isto um texto simples.";
1.10.7 Tipos de dados
Como C# uma linguagem fortemente tipada (strongly typed), todas as variveis
e objetos devem ter um tipo declarado. Os tipos de dados se dividem em value types
e reference types. Todos os value types so derivados de System.ValueType, enquanto os
reference types so derivados de System.Object.
As variveis baseadas em tipos de valor (value types) contm diretamente o valor.
Quando copiamos uma varivel para outra, uma cpia do valor passado; em tipos
de referncia (reference types), passada somente uma referncia do objeto.
Os values types dividem-se em duas categorias principais: estruturas (structs) e enu-
meraes (enum).
As estruturas struct so divididas em tipos numricos (tipos integrais, ponto utu-
ante e decimal), bool e estruturas personalizadas criadas pelos programadores.
A seguir, na tabela 1.1, temos os tipos integrais com seu tamanho e a faixa de valores
que podem conter:
40 Como Programar com ASP.NET e C#
Tabela 1.1 Tipos integrais
Tipo Intervalo Tamanho Valor padro
sbyte -128 at 127 Inteiro de 8 bits com sinal 0
byte 0 at 255 Inteiro de 8 bits sem sinal 0
char U+0000 at U+ff Caractere Unicode de 16 bits \0
short -32,768 at 32,767 Inteiro de 16 bits com sinal 0
ushort 0 at 65,535 Inteiro de 16 bits sem sinal 0
int -2,147,483,648 at 2,147,483,647 Inteiro de 32 bits com sinal 0
uint 0 at 4,294,967,295 Inteiro de 32 bits sem sinal 0
long
-9,223,372,036,854,775,808 at
9,223,372,036,854,775,807
Inteiro de 64 bits com sinal 0L
ulong 0 at 18,446,744,073,709,551,615 Inteiro de 64 bits sem sinal 0
Os tipos de ponto utuante so: foat, double, os quais diferem entre si na faixa e na
preciso, conforme mostra a tabela 1.2:
Tabela 1.2 Tipos de ponto utuante
Tipo Intervalo aproximado Preciso Valor padro
foat 1.5e-45 at 3.4e38 7 digitos 0.0F
double 5.0e-324 at 1.7e308 15-16 digitos 0.0D
Alm do intervalo padro suportado por cada tipo, podemos acrescentar um valor
nulo. Para isso, basta declarar o nome do tipo com um ponto de interrogao.
Exemplo:
int? x = 10;
Use o operador ?? para denir um valor padro, caso o tipo seja nulo:
int d = x ?? 0;
Ou use o mtodo GetValueOrDefault:
int? x = 10;
x.GetValueOrDefault(0);
A propriedade HasValue verica se um tipo contm ou no um valor nulo.
Exemplo:
int? x=5;
if (x.HasValue) {
Console.WriteLine(x.Value);
}
else {
Console.WriteLine("Valor nulo.");
}
41 Captulo 1

Introduo ao C# e .NET Framework


1.10.7.1 Tipo decimal
O tipo decimal de alta preciso. Ideal para clculos nanceiros e monetrios, um
tipo de dados de 128 bits que pode representar valores de aproximadamente:
1.0 10
28
at 7.9 10
28
com 28 ou 29 dgitos signicantes. A preciso dada em dgitos e no em casas
decimais.
O suxo m ou M deve ser utilizado para declarar variveis do tipo decimal.
decimal x = 102.89m;
Sem o suxo m ou M, a varivel ser tratada como se fosse do tipo double. Um erro
gerado em tempo de compilao.
1.10.7.2 BigInteger e Complex
O .NET Framework 4.0 inclui dois novos tipos: BigInteger e Complex, sendo que ambos
fazem parte do espao para nome System.Numerics e no contm intervalos xos, ou
seja, no tm limites predenidos como um inteiro tradicional.
Para utilizar um tipo BigInteger ou Complex, preciso adicionar uma referncia a names-
pace System.Numerics. No Visual Studio 2010, abra a janela Solution Explorer, clique com o
boto direito do mouse no nome do projeto e selecione a opo Add reference.... Na aba
.NET, selecione System.Numerics. Clique em OK. Pronto, agora s importar a namespace:
using System.Numerics;
Exemplo:
//Arquivo de exemplo: biginteger.cs
// Para compilar use: csc /r:System.Numerics.dll biginteger.cs
using System;
using System.Numerics;
namespace AlfredoLotar.Livro.Aspnet {
class Programa {
static void Main(string[] args) {
long varLong = 931548458140;
BigInteger fromLong = varLong;
Console.WriteLine("Nmero convertido para BigInteger.");
Console.WriteLine(fromLong);
Console.Read();
}
}
}
O tipo Complex suporta operaes aritmticas e trigonomtricas, bastante teis para
aplicaes na rea de engenharia eltrica e eletrnica.
42 Como Programar com ASP.NET e C#
Exemplo:
//Arquivo de exemplo: Complex.cs
//Para compilar use: csc /r:System.Numerics.dll complex.cs
using System;
using System.Numerics;
namespace AlfredoLotar.Livro.Aspnet {
class Programa {
static void Main(string[] args) {
var c1 = new Complex(2, 5);
var c2 = new Complex(4, 7);
var add = c1 + c2;
Console.WriteLine("Adio: " + add);
var sub = c1 - c2;
Console.WriteLine("Subtrao: " + sub);
var mult = c1 * c2;
Console.WriteLine("Multiplicao: " + mult);
var div = c1 / c2;
Console.WriteLine("Diviso: " + div);
Console.Read();
}
}
}
O exemplo retorna:
Adio: (6, 12)
Subtrao: (-2, -2)
Multiplicao: (-27, 34)
Diviso: (0,661538461538462, 0,0923076923076923)
1.10.7.3 Tipo char
Representa um nico caractere Unicode de 16 bits. utilizado para representar a maioria das
linguagens no mundo. Assim, podemos criar variveis do tipo char e adicionar caracteres:
char letra = 'A';
char letra1 = 'H';
Uma varivel char pode conter sequncias de escape hexadecimal (prexo \x) ou uma
representao Unicode (prexo \u):
char letra2 = '\x0072'; // Hexadecimal
char letra3 = '\u0072'; // Unicode
Podemos transformar, de forma explcita, um integral em um char ou vice-versa.
char letra4 = (char)72; // corresponde a letra H
int numero = (int)'B'; // inteiro 66
43 Captulo 1

Introduo ao C# e .NET Framework


Combinaes de caracteres que consistem de uma barra invertida (\) seguida de uma
letra ou combinao de dgitos so chamadas de sequncia de escape. Sequncias de
escape so usadas em situaes especcas, como: salto de linha, retorno de carro,
avano de pgina, tabulao horizontal e vertical. Veja a seguir as sequncias de
escape usadas no C#:
Sequncia Signifcado
\' Apstrofo
\" Aspas
\\ Barra invertida
\a Alerta
\b Retrocesso
\f Avano de pgina
\n Salto de linha
\r Retorno de carro
\t Tabulao horizontal
\v Tabulao vertical
Uma varivel precisa ser inicializada antes de ser utilizada. Se voc declarar uma
varivel sem declarar um valor inicial, por exemplo:
int x;
ser preciso inicializ-la; do contrrio, no ser possvel utiliz-la. Podemos inicializar
uma varivel usando o operador new, o qual atribui o valor-padro do tipo de dados
int varivel x:
x = new int();
Isso equivalente a:
int x = 0;
1.10.7.4 Tipo bool
Representa um valor verdadeiro ou falso. usado com variveis ou mtodos que
retornam o valor true ou false. O valor-padro do tipo bool false:
bool x = true;
bool b = false;
Os tipos usados pelo C# podem ser manipulados por estruturas e classes (object e
string) do .NET Framework:
Tipo C# .NET Framework
bool System.Boolean
byte System.Byte
sbyte System.Sbyte
char System.Char
44 Como Programar com ASP.NET e C#
Tipo C# .NET Framework (cont.)
decimal System.Decimal
double System.Double
foat System.Single
int System.Int32
uint System.UInt32
long System.Int64
ulong System.UInt64
object System.Object
short System.Int16
ushort System.UInt16
string System.String
1.10.7.5 Enumeraes enum
As enumeraes permitem criar um tipo distinto, formado por um conjunto de cons-
tantes nomeadas. A seguir, temos sua forma mais simples:
enum Dias {Domingo, Segunda, Tera, Quarta, Quinta, Sexta, Sbado};
Os elementos da enumerao so por padro do tipo int. No entanto, os elementos
podem ser de qualquer tipo integral, exceto char. O primeiro elemento zero, o se-
gundo elemento igual a 1, e assim sucessivamente.
Na enumerao anterior, Domingo igual a 0 (zero), Segunda igual a 1, Tera
igual a 2 etc.
Podemos tambm atribuir valores arbitrrios a cada elemento:
enum Dias {Domingo = 10, Segunda = 25, Tera = 48, Quarta = 8, Quinta, Sexta, Sbado};
Os elementos aos quais no atribumos valores arbitrrios so incrementados a partir
do ltimo elemento com valor. Exemplo:
Domingo igual a 10, Segunda 25, Tera 48, Quarta 8, Quinta 9, Sexta 10,
Sbado 11. Um tipo integral diferente de int pode ser denido:
enum Dias:short {Domingo, Segunda, Tera, Quarta, Quinta, Sexta, Sbado};
Para acessar o valor de cada elemento, necessrio converter, de forma explcita, cada
elemento da enumerao para int:
int x = (int) Dias.Domingo;
int y = (int) Dias.Sexta;
Console.WriteLine(x);
Console.WriteLine(y);
O valor retornado :
0
5
45 Captulo 1

Introduo ao C# e .NET Framework


Para acessar o valor de vrios elementos ao mesmo tempo, preciso antes preparar a enu-
merao. O atributo System.FlagsAttribute deve ser usado na declarao da enumerao:
[Flags]
public enum Dias { Segunda = 0x01, Quarta = 0x02};
O exemplo completo que segue retorna Segunda, Sexta, Sbado:
// Arquivo de exemplo: enum.cs
// Para compilar use: csc enum.cs
using System;
public class FlagEnum {
[Flags]
public enum Dias {
Segunda = 0x01,
Quarta = 0x02,
Sexta = 0x04,
Sbado = 0x08,
}
static void Main() {
Dias d = Dias.Sbado | Dias.Segunda | Dias.Sexta;
Console.WriteLine(d);
}
}
1.10.7.6 Tipos de referncia reference types
Nas variveis de tipos de referncia (reference types), somente uma referncia do
objeto passada. A seguir, temos os tipos de referncias: class, interface, delegate,
object, string e Array.
Tipo object
Todos os tipos so herdados direta ou indiretamente da classe Object. Assim, possvel
converter qualquer tipo para object. O ato de converter um varivel value type para
object chamado de Boxing. E quando um tipo object convertido para um value type,
chamado de Unboxing. O tipo object representado pela classe Object no .NET Framework.
object x = 1;
Tipo string
O tipo string o mais utilizado, uma vez que todas as variveis que no contm n-
meros quase sempre so declaradas como string. O tipo string representado por uma
sequncia de caracteres Unicode. Uma string deve estar cercada por aspas duplas (""):
string b = "texto aqui";
O sinal de mais (+) usado para concatenar uma string:
string b = "Concatenando este " + " texto";
string x = "A" + 2;
46 Como Programar com ASP.NET e C#
Outro recurso importante a facilidade de extrair um caractere denido na varivel:
char extrai = b[5];
A linha anterior extrai a letra t da varivel b.
Voc pode extrair uma letra de uma palavra:
char extrai = "Alfredo"[3];
A varivel extrai retorna a letra r.
O arroba (@) evita que sequncias de escape sejam processadas:
@"C:\Livro\Capitulo1\Construtores.cs"
o mesmo que:
"C:\\Livro\\Capitulo1\\Construtores.cs"
Evita que aspas sejam interpretadas dentro de uma string cercada por aspas duplas.
string aspas = @"""abc"" teste";
A linha anterior retorna: "abc" teste.
1.10.8 Operadores
Os operadores so utilizados com expresses. Uma expresso um fragmento de
cdigo que pode ser representado por um valor nico, um mtodo, um objeto, um
espao para nome. Uma expresso pode conter um valor literal, invocar um mtodo,
um operador ou uma varivel.
O operador um termo ou smbolo que pode ser usado com uma ou mais expresses,
chamadas de operandos. O que tem somente um operando chamado de operador
unrio; o que possui dois operandos, por sua vez, chamado de operador binrio.
Operador unrio (++)
x++;
Operador binrio (*)
x=5 * 8;
A tabela a seguir lista os operadores suportados pelo C#. As categorias so listadas
em ordem de precedncia.
Categoria Operadores
Primrios x.y, f(x), a[x], x++, x--, new, typeof, checked, unchecked, ->
Unrios +, -, !, ~, ++x, --x, (T)x, true, false, &, sizeof
Aritmticos *, /, %, +, -
Shift <<, >>
Relacional <, >, <=, >=, is, as
47 Captulo 1

Introduo ao C# e .NET Framework


Categoria Operadores (cont.)
Igualdade ==, !=
E lgico &
OU exclusivo lgico ^
OU lgico |
E condicional &&
OU condicional ||
Condicional ?:
Atribuio =, +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=
Null-coalescing ??
Lambda =>
Voc pode criar suas prprias equaes, na quais possvel utilizar combinaes de
operadores. Ao fazer essas combinaes, devemos obedecer sua precedncia, ou seja,
para realizar os clculos corretamente, devemos obedecer ordem de processamento
dos operadores, a qual conhecida como precedncia de operadores. Entender como
funciona a precedncia de operadores fundamental para realizar clculos correta-
mente. Quando dois operadores com a mesma precedncia esto presentes em uma
expresso, eles so avaliados da esquerda para direita:
int x = 2 + 5 * 8;
atribudo varivel x o total do clculo: 5 * 8 + 2 igual 42.
Veja a seguir como podero ocorrer resultados inesperados se no for considerada a
ordem de processamento dos operadores:
int x= 9 * 3 + 4 / 2;
Por exemplo, se voc executar o clculo da esquerda para a direita, nesse caso, 9 *
3 igual a 27; 27 + 4 igual a 31; 31 / 2 igual 15,5, qual seria o resultado correto
obedecendo precedncia de operadores?
9 * 3 igual a 27; 4 / 2 igual a 2; e 27 + 2 igual a 29.
Parnteses podem ser usados para cercar parte da expresso e assim forar para que
seja executada antes da outra. Exemplo:
int x = 9 * (3 + 5) / 2;
No exemplo anterior, os valores contidos nos parnteses so executados primeiro:
3 + 5 igual a 8; em seguida, efetuada a multiplicao: 9 * 8 que igual a 72; e,
por m, a diviso 72 / 2 que igual a 36. O resultado armazenado na varivel x 36.
1.10.8.1 Operadores aritmticos
Operaes matemticas que processam clculos utilizam operadores aritmticos, os
quais so imprescindveis em aplicaes nanceiras:
48 Como Programar com ASP.NET e C#
int v = 2 * 3; // retorna 6
int d = 6 / 3; // retorna 2
int r = 13 % 5; // retorna 3
int s = 5 + 3; // retorna 8
int m = 5 - 3; // retorna 2
Obs.: os operadores condicionais so abordados no tpico 1.10.10 deste captulo.
1.10.8.2 Operador %
O operador % retorna o resto de uma diviso. 13 % 5 igual a 3.
1.10.8.3 Operador ++x e --x
Os operadores unrios (++x, --x), respectivamente, incrementam e decrementam o
valor de uma varivel.
Exemplo:
int x = 1;
++x; // x agora igual a 2
int b = 5;
--b; // b agora igual a 4
1.10.8.4 Operador !
O ponto de exclamao (!) um operador lgico de negao.
Exemplo:
// Retorna true se o ano de 2013 no for bissexto
if (!DateTime.IsLeapYear(2013)) { }
1.10.8.5 Operadores relacionais
Operadores relacionais comparam valores contidos nos operandos e retornam um
valor booleano com base na comparao realizada.
5 < 10
Exemplo:
if (5 < 10) {}
Retorna true, pois 5 < 10:
5 > 10
Exemplo:
if (5 > 10) {}
Retorna false, pois 5 < 10.
49 Captulo 1

Introduo ao C# e .NET Framework


Vericao semelhante pode ser realizada com os operadores menor ou igual (<=) e
maior ou igual (>=):
5 <= 10
5 >= 10
Exemplo:
if (5 <= 10) {}
if (5 >= 10) {}
Operador is verica se um objeto compatvel com um determinado tipo:
if (obj is string) {}
E, por ltimo, o operador as realiza converses entre tipos de referncia (reference
types) compatveis.
Exemplo:
object obj = "Alfredo";
string x = obj as string;
1.10.8.6 Operadores de igualdade
Operadores de igualdade ==, != tambm retornam valores booleanos referentes
comparao realizada entre os operandos:
5 == 2
10 != 3
Exemplo:
if (5 == 2) {}
if (10 != 3) {}
1.10.8.7 Operadores de atribuio
Os operadores de atribuio incrementam ou decrementam os valores dos operandos:
int x = 8; // Atribui 8 a varivel x
x += 2; // Incrementa e armazena o novo valor de x
x -= 3; // Decrementa e armazena o novo valor de x
x *= 8; // Multiplica e armazena o valor atual de x. Igual x*8
x /= 2; // Divide e armazena o valor atual de x. Igual x/2
x %= 3; // Armazena o resto da diviso em x. Igual x%3
1.10.8.8 Operadores Shift
Ambos os operandos dos operadores Shift devem ser um tipo integral. O primeiro
operando desloca-se conforme a quantidade de bits denida no segundo operando.
O operador >> faz com que o deslocamento seja para a direita, enquanto o operador
<< realiza o deslocamento para a esquerda.
50 Como Programar com ASP.NET e C#
Exemplo:
int x = 2000;
Console.WriteLine(x >> 4); // Retorna 125
Console.WriteLine(x << 4); // Retorna 32000
Para entender melhor como funciona o operador Shift >>, faremos o clculo manual
at obtermos o valor 125. Observe o exemplo anterior.
O nmero 4 usado no segundo operando signica que devemos realizar quatro di-
vises por 2 do valor contido na varivel x. Exemplo: 2.000 / 2 igual a 1.000; 1.000
/ 2 igual a 500; 500 / 2 igual a 250; e, por m, 250 / 2 125. O operador <<, por
sua vez, requer uma multiplicao por 2.
Exemplo:
2 x 125 = 250 x 2 = 500 x 2 = 1.000 x 2 = 2.000.
1.10.9 Instrues de controle
Uma instruo de controle usada para controlar a execuo de partes de um pro-
grama. Sem as instrues de controle, um programa seria executado da primeira
ltima linha. As instrues de controle utilizadas no C# so if, switch e else if.
1.10.9.1 Instruo if
A instruo if utilizada para vericar se determinada condio verdadeira (true)
ou falsa (false). Caso a condio seja verdadeira, os comandos contidos na instruo
if sero executados. A sintaxe da instruo if a seguinte:
if (condio) comando;
Desse modo, a condio representa qualquer condio lgica de comparao:

A condio pode ser representada por uma varivel.

Campo de um banco de dados que retorna um valor booleano (true ou false).

Expresso que retorna um valor booleano (true ou false).
O argumento comando representa ao ou tarefa que deve ser realizada caso a con-
dio seja verdadeira:
int a = 2;
if (a > 1) Console.WriteLine("Condio verdadeira");
Alm da instruo if, possvel testar a condio de uma expresso com o operador
?: Observe a sintaxe:
condio ? expresso1 : expresso2;
Se a condio for verdadeira, a primeira expresso ser executada; caso seja falsa,
ser executada a segunda expresso.
51 Captulo 1

Introduo ao C# e .NET Framework


Exemplo:
int a = 2;
string mensagem = a > 1 ? "Condio verdadeira" : "Condio falsa";
Console.WriteLine(mensagem);
Anteriormente, observou-se a sintaxe da instruo if de linha nica, ou seja, os
comandos so colocados em uma nica linha aps a condio. possvel utilizar
a instruo if em bloco, ou seja, podemos executar vrias linhas de comando se a
condio for verdadeira. A sintaxe da instruo if em bloco :
if (condio) {
// comando1...
// comando2...
}
Se a condio for verdadeira, todas as linhas de comando sero executadas; mas se a
condio for falsa, o programa saltar para a primeira linha aps a chave (}):
int a = 2;
if (a > 1) {
string mensagem = "Condio verdadeira";
Console.WriteLine(mensagem);
}
possvel aninhar mltiplas instrues if:
int a = 2;
if (a > 1) {
if (a == 2) {
string mensagem = "Condio verdadeira";
Console.WriteLine(mensagem);
}
}
Em determinadas ocasies, voc pode querer executar comandos quando uma con-
dio for falsa. H duas formas bsicas de executar comandos quando isso acontecer.
A primeira utiliza o operador unrio !, que inverte a condio real que o segue. Se
a condio for verdadeira (true), o operador ! torna toda a expresso falsa (false) e
vice-versa. A segunda forma utiliza a instruo else. Exemplo:
if (condio) {
// Instrues parte verdadeira
}
else {
// Instrues da parte falsa
}
As instrues da parte else s sero executadas se a condio contida na instruo
if no for satisfeita.
52 Como Programar com ASP.NET e C#
Exemplo:
bool a = true;
if (!a) {
string mensagem = "Condio verdadeira";
Console.WriteLine(mensagem);
}
else {
string mensagem = "Condio falsa";
Console.WriteLine(mensagem);
}
Alm das instrues mencionadas, podemos denir diversas condies dentro de
um bloco if. Isso pode ser feito com o auxlio da instruo else if. A instruo else
if permite especicar outra condio a ser avaliada se a primeira condio for falsa.
impossvel avaliar diversas condies utilizando apenas um bloco if. Devemos res-
saltar que, independentemente do nmero de instrues que forem denidas em um
bloco if, somente os comandos da condio verdadeira sero executados. Exemplo:
// Arquivo de exemplo: IfElse.cs
// Para compilar use: csc IfElse.cs
using System;
class TesteIfElse {
static void Main() {
Console.WriteLine("Digite um dos seguintes nmeros: 1, 2, 3, 4");
int a = Int32.Parse(Console.ReadLine());
string mensagem = "Varivel a igual: ";
if (a == 1) {
Console.WriteLine(mensagem + a);
}
else if (a == 2) {
Console.WriteLine(mensagem + a);
}
else if (a == 3) {
Console.WriteLine(mensagem + a);
}
else {
Console.WriteLine(mensagem + a);
}
}
}
O mtodo Parse da estrutura Int32 converte o valor inserido pelo usurio para um
inteiro. Somente valores numricos so aceitos.
int a = Int32.Parse(Console.ReadLine());
53 Captulo 1

Introduo ao C# e .NET Framework


1.10.9.2 Instruo switch
A instruo switch permite a execuo condicional de instrues de acordo com os
valores de um argumento teste, o qual pode ser uma varivel, uma expresso numrica,
uma string ou funes. A sintaxe da instruo switch :
switch (ArgumentoDeTeste) {
case ExpressoDoValor:
// Cdigo a executar, se a condio for verdadeira.
break;
default:
// Cdigo a executar, se nenhuma condio anterior for verdadeira.
break;
}
O argumento de teste denido com switch deve ser testado em comparao com os va-
lores das demais instrues case. Se o valor do argumento de teste for igual expresso
do valor, ento os comandos que seguem a instruo case devem ser executados. Se
o valor do argumento de teste for diferente da expresso do valor, ento o programa
compara o valor do argumento de teste com a expresso da prxima instruo case.
A instruo switch pode incluir qualquer nmero de instncias case, entretanto duas
declaraes case no podem ter o mesmo valor. A palavra-chave break obrigatria
aps cada bloco case:
// Arquivo de exemplo: switch.cs
// Para compilar use: csc switch.cs
using System;
class Testeswitch {
static void Main() {
Console.WriteLine("Digite um dos seguintes nmeros: 1, 2, 3, 4, 5");
int a = Int32.Parse(Console.ReadLine());
string mensagem = "Varivel a igual: ";
switch (a) {
case 1:
Console.WriteLine(mensagem + "1");
break;
case 2:
Console.WriteLine(mensagem + "2");
break;
case 3:
goto case 1;
case 4:
case 5:
Console.WriteLine(mensagem + a);
break;
default:
Console.WriteLine(mensagem + a);
break;
}
}
}
54 Como Programar com ASP.NET e C#
H casos em que no podemos prever todos os valores possveis do argumento de teste.
Nessa circunstncia, utilizamos a instruo default dentro do bloco switch para realizar
uma ao especca caso nenhuma instruo case corresponda ao argumento de teste.
A instruo default opcional. A palavra-chave goto transfere o controle para uma clu-
sula case especca ou para a clusula default, sendo muito til em loops do tipo for.
1.10.10 Operadores condicionais
Os operadores condicionais permitem testar vrias condies no mesmo bloco if.
Muitas vezes, queremos executar uma determinada ao somente se determinadas
condies forem satisfeitas, por exemplo, se o aluno estiver no terceiro ano do ensino
mdio e se tiver mais de 18 anos, ento o valor da mensalidade ser igual a R$ 500.
Nota-se que a mensalidade do aluno s denida quando as condies dos dois
argumentos forem satisfeitas. Podemos reescrever o exemplo citado anteriormente
usando a instruo if:
int ano = 3;
int idade = 18;
decimal mensalidade = 350m;
if (ano==3 && idade>18) {
mensalidade = 500m;
}
Assim, a varivel somente denida com o valor decimal 500 quando as duas con-
dies forem verdadeiras. Na tabela a seguir, temos os principais operadores condi-
cionais utilizados no C#:
Operador Descrio
&& Retorna verdadeiro se todos os argumentos forem verdadeiros; retorna falso
se pelo menos um argumento for falso.
|| Retorna verdadeiro se pelo menos um argumento for verdadeiro; retorna falso
se todos os argumentos forem falso.
Exemplo completo:
// Arquivo de exemplo: mensalidade.cs
// Para compilar use: csc mensalidade.cs
using System;
class mensalidade {
static void Main() {
Console.WriteLine("Digite um valor maior ou menor que 18:");
int ano = 3;
int idade = Int32.Parse(Console.ReadLine());
decimal mensalidade = 350m;
if (ano==3 && idade>18) {
mensalidade = 500m;
}
Console.WriteLine("Valor mensal: " + mensalidade);
}
}
55 Captulo 1

Introduo ao C# e .NET Framework


1.10.11 Loops contadores
Os loops contadores executam uma tarefa em determinado nmero de vezes. A ins-
truo for pode ser caracterizada como loop contador, pois conhecemos os extremos
que devem ser percorridos pelo bloco for. Sintaxe da instruo for:
for (tipo Contador = ValorInicial; Contador (< | > | >= | <=) ValorFinal; Contador(++ | --)){
// cdigo aqui;
}
A varivel que serve como contador denida com o valor inicial, e, cada vez que o
loop executado, o valor do contador incrementado (++) ou decrementado (--) e
comparado com o valor nal. No exemplo, se o valor do contador for maior do que
o valor nal, o programa saltar para a primeira linha aps a chave (}):
for (int i = 0; i <= 10; i++) {
// cdigo aqui;
}
A palavra-chave var pode ser usada tambm para inicializar blocos do tipo for:
for (var i = 0; i <= 10; i++) {
// cdigo aqui;
}
Podemos sair de loop for usando a palavra-chave goto quando uma determinada
condio for satisfeita. A palavra-chave goto redene o uxo do programa saltando
para linhas predenidas:
for (int i = 0; i <= 10; i++) {
if (i == 5) {
goto FluxoAqui;
}
}
FluxoAqui:;
A palavra-chave break tambm interrompe a execuo do loop for:
for (int i = 0; i <= 10; i++) {
if (i==5) {
break;
}
}
A palavra-chave continue permite saltar para o prximo bloco de execuo dentro
do loop for. Exemplo: considere que o valor atual do contador dentro do loop um
nmero par. Nesse caso, poderamos utilizar a palavra-chave continue para saltar para
o prximo bloco, de modo que somente os nmeros mpares seriam impressos na
tela. Observe o trecho de cdigo e o exemplo a seguir:
for (int i = 0; i <= 10; i++) {
if (i % 2 == 0) {
continue;
}
Console.WriteLine(i.ToString());
}
56 Como Programar com ASP.NET e C#
Exemplo completo:
// Arquivo de exemplo: forteste.cs
// Para compilar use: csc forteste.cs
using System;
class TesteFor {
static void Main() {
for (int i = 0; i <= 10; i++) {
if (i % 2 == 0) {
continue;
}
Console.WriteLine(i.ToString());
}
}
}
O exemplo anterior imprime na tela os nmeros: 1, 3, 5, 7, 9. O mtodo ToString con-
verte o valor numrico da varivel i em uma string equivalente.
Podemos colocar um bloco for dentro do outro. Assim, cada loop for superior executa
todos os elementos do loop inferior. No exemplo a seguir, o loop for com o contador
i ser executado 10 vezes, fazendo com que o cdigo no interior do loop seja execu-
tado 100 vezes:
for (int i = 1; i <= 10; i++) {
for (int j = 1; j <= 10; j++) {
// cdigo aqui executado 100 vezes
}
// cdigo aqui executado 10 vezes
}
O exemplo a seguir imprime 10 vezes o contedo da varivel i e 100 vezes o contedo
da varivel j:
// Arquivo de exemplo: foraninhado.cs
// Para compilar use: csc foraninhado.cs
using System;
class foraninhado {
static void Main() {
for (int i = 1; i <= 10; i++) {
for (int j = 1; j <= 10; j++) {
Console.WriteLine(j.ToString());
}
Console.WriteLine(i.ToString());
}
}
}
Para realizar uma contagem regressiva, basta denir o contador com um valor negativo
e inverter o valor inicial e o valor nal. Veja a seguir:
for (int i = 10; i >= 1; i--) {
Console.WriteLine(i.ToString());
}
57 Captulo 1

Introduo ao C# e .NET Framework


Para retornar valores em um loop para uma enumerao, utilize a palavra-chave yield
juntamente com a palavra-chave return. Exemplo:
// Arquivo de exemplo: yield.cs
// Para compilar use: csc yield.cs
using System;
using System.Collections;
namespace AlfredoLotar.Livro.Aspnet {
class Programa {
public static IEnumerable Impares(int inicio, int fim) {
int resultado = 1;
while (inicio++ < fim) {
if (inicio % 2 != 0) {
resultado = inicio;
yield return resultado;
}
}
}
static void Main() {
foreach (int i in Impares(0, 10)) {
Console.Write("{0} ", i);
}
Console.Read();
}
}
}
Para interromper um loop, use a combinao de palavras-chave yield break. Exemplo:
public static IEnumerable Impares(int inicio, int fim) {
while (inicio++ < fim) {
yield return inicio;
if (inicio > 6) yield break;
}
}
1.10.12 Loops condicionais
O C# suporta loops condicionais que nos permitem executar tarefas repetitivas,
enquanto determinada condio for satisfeita. A condio retorna um valor booleano
(true ou false). Assim como acontece com a instruo if, a condio pode ser uma
funo, uma varivel booleana ou uma expresso.
1.10.12.1 Instruo while
O primeiro loop condicional a ser visto ser while, que executa os comandos dentro
do loop enquanto a condio for verdadeira. A sintaxe da instruo while :
58 Como Programar com ASP.NET e C#
while(condio) {
// Cdigo aqui;
varivel (++ | --)
}
Se a condio for verdadeira, as instrues colocadas dentro do bloco {} sero exe-
cutadas, e o programa novamente avaliar a condio. Logo que a condio se tornar
falsa, o programa passar a executar as instrues colocadas aps a chave (}).
Exemplo:
int i = 0;
while(i <= 10) {
Console.WriteLine(i.ToString());
i++;
}
Podemos incrementar a varivel i ao avaliar a condio:
int i = 0;
while(i++ <= 10) {
Console.WriteLine(i.ToString());
}
Um loop while ou do pode ser encerrado pelas palavras-chave break, goto, return ou
throw. A palavra-chave continue tambm pode ser usada.
1.10.12.2 Instruo do
Voc deve ter notado que, na palavra-chave while, a condio avaliada antes de
executar qualquer comando do loop. Se a condio for verdadeira, as instrues do
loop sero executadas. Se a condio for falsa antes da primeira execuo do loop, o
programa prosseguir com as instrues colocadas aps o loop. Dessa forma, pode
ser que as instrues no interior do loop jamais sejam executadas. Se voc quiser
que as instrues no interior do loop sejam executadas ao menos uma vez, utilize a
instruo do. A sintaxe da instruo do :
do {
// Cdigo aqui
varivel (++ | --)
}
while (condio);
Exemplo:
int x = 0;
do {
Console.WriteLine(x);
x++;
}
while (x <= 10);
59 Captulo 1

Introduo ao C# e .NET Framework


1.10.13 Loop de enumerao
Os loops de enumerao permitem percorrer itens de arrays e colees. A instruo
foreach considerada um loop de enumerao. Cada item de uma coleo conside-
rado um objeto. A sintaxe da instruo foreach :
foreach (tipo elemento in coleo) {
}
Parmetro Descrio
elemento a varivel utilizada para percorrer os itens da coleo ou o array.
tipo o tipo de dados utilizado pela varivel (elemento).
coleo o objeto que contm o array ou a coleo.
A palavra-chave var tambm pode inicializar blocos foreach:
foreach(var item in lista){...}
Exemplo com a instruo foreach:
//Arquivo de exemplo: foreach.cs
//Para compilar use: csc foreach.cs
using System;
namespace AlfredoLotar.Livro.Aspnet {
class Programa {
static void Main(string[] args) {
string[] cores = new string[3];
cores[0] = "Azul";
cores[1] = "Vermelho";
cores[2] = "Verde";
Console.WriteLine("Exibe nome de cores:\n");
foreach (var cor in cores) {
Console.WriteLine(cor);
}
Console.Read();
}
}
}
1.10.14 Classes
As classes nos permitem organizar de forma coerente o cdigo que criamos. Por exem-
plo, podemos criar uma classe chamada custos contendo todas as funes necessrias
para manipular os clculos referentes aos custos de uma empresa.
Uma classe o tipo de dados mais poderoso do C#. Classes denem os dados e os
comportamentos de um tipo de dados.
60 Como Programar com ASP.NET e C#
Os membros de uma classe podem ser: construtores, destrutores, constantes, campos,
mtodos, propriedades, indexadores, operadores, eventos, delegates, classes, interfaces,
estruturas.
Uma classe declarada com a instruo class e pode ser precedida de um modicador
de acesso. Sua sintaxe :
[modificador] class nome {
}
Exemplo:
public class Taxas {
// cdigo aqui;
}
Para acessar os membros de uma classe, criamos uma instncia de classe, chamada
de objeto, que, por sua vez, uma entidade concreta baseada em uma classe.
Os objetos podem conter dados e ter comportamento: os dados dos objetos so
armazenados em campos, propriedades e eventos do objeto; o comportamento dos
objetos denido por mtodos e interfaces do objeto. sempre importante ressaltar
que dois objetos idnticos podem no conter os mesmos dados.
Algumas caractersticas dos objetos em C#:

Tudo o que voc usa em C# um objeto, inclusive formulrios Windows
(Windows Forms) e controles.

So denidos como modelos de classes e structs.

Usam propriedades para obter e modicar informaes que contm.

Tm mtodos e eventos que permitem executar aes.

So herdados da classe Object.
Os objetos so denidos por classes e estruturas e so criados pela palavra-chave new.
Para criar uma instncia da classe Taxas, usamos a seguinte sintaxe:
Tipo Referncia = new Tipo();
Exemplo:
Taxas objTax = new Taxas();
Quando a instncia de uma classe criada, uma referncia para o objeto passada
para o programador. No exemplo anterior, objTax uma referncia para um objeto com
base na classe Taxas. Assim, a classe no um objeto, embora dena um tipo de objeto.
Podemos criar uma referncia para um objeto sem criar um objeto. Exemplo:
Taxas objTax;
61 Captulo 1

Introduo ao C# e .NET Framework


Antes de usar objTax, devemos criar o objeto com a palavra-chave new, pois o acesso a
objetos que no existem falha em tempo de execuo.
Acessar os membros de uma classe muito fcil, basta criar uma instncia da classe
com a palavra-chave new e, em seguida, usar a referncia para o objeto seguido de um
ponto nal e o nome do membro. O exemplo a seguir acessa um membro (mtodo)
chamado Calculo.
Taxas objTax = new Taxas();
objTax.Calculo();
Quando somente um membro acessado, convm usar a seguinte sintaxe:
new Taxas().Calculo();
Nesse caso, no h necessidade de se criar uma varivel.
s vezes, usamos recursos compartilhados que consomem muitos recursos do siste-
ma, por exemplo, o acesso a banco de dados, conexes internet, acesso a arquivos
etc. Nesses casos, devemos liberar os recursos utilizados o mais rpido possvel. O
bloco using til em situaes em que devemos lidar com esses recursos caros, pois
os recursos so imediatamente liberados quando seu cdigo sai do bloco. Quando
no denimos explicitamente que um recurso deve ser liberado, ca a critrio do
garbage collector liberar o recurso quando no est sendo utilizado pelo programa.
Exemplo:
using (Taxas objTax = new Taxas()) {
// cdigo aqui;
}
Obs.: somente as classes que implementam a interface IDisposable podem ser
utilizadas pelo bloco using. A interface IDisposable tem um mtodo chamado Dispose,
o qual utilizado para liberar os recursos do objeto.
Herana de classe e interfaces sero abordadas no segundo captulo deste livro. A
seguir, temos a classe Taxas implementando a interface IDisposable e o mtodo Dispose:
public class Taxas : IDisposable {
void IDisposable.Dispose() {
// cdigo que libera o recurso aqui;
}
}
1.10.14.1 Modifcadores de acesso
Os modicadores de acesso so utilizados para restringir o acesso s classes e a seus
membros. Todo o tipo declarado dentro de uma classe sem um modicador de acesso
, por padro, considerado private. Os modicadores de acesso de classes permitidos
so: public, protected, internal, protected internal, private.
62 Como Programar com ASP.NET e C#
Modifcadores Descrio
public A classe acessvel em qualquer lugar. No h restries.
private Acessvel apenas dentro do contexto em que foi declarada.
protected A classe acessvel somente na prpria classe e nas classes derivadas.
internal A classe acessvel somente no prprio Exe/DLL que a declarou. o
padro, caso nenhum modicador seja especicado.
protected internal a unio dos modicadores protected e internal.
Os modicadores de acesso protected e private s so permitidos em classes aninhadas.
Exemplo de classe aninhada:
public class Taxas {
private class Juros {
}
}
Os tipos aninhados so private por padro e podem acessar membros denidos como
private e protected da classe em que esto contidos. Devemos usar o nome qualicado
completo para acessar os membros de classes aninhadas. Exemplo:
public class Taxas {
public class Juros {
}
}
Para criar uma instncia da classe aninhada, usamos:
Taxas.Juros obj = new Taxas.Juros();
1.10.14.2 Classes estticas static classes
Classes e membros estticos podem ser acessados sem a necessidade de se criar uma
instncia da classe. Uma classe pode ser declarada com o modicador static, indi-
cando que s pode conter membros estticos. No possvel criar uma instncia de
uma classe static com a palavra-chave new:
public static class Livro {
// Membros static aqui
}
As classes estticas so carregadas automaticamente pelo CLR quando o programa
que contm a classe carregado. Algumas caractersticas das classes estticas:

Contm somente membros estticos.

No possvel criar uma instncia.

No podem ser implementadas por intermdio de herana.

No podem conter um mtodo construtor.
Membros estticos so teis em situaes em que o membro no precisa estar as-
sociado a uma instncia da classe, por exemplo, em situaes que o valor contido
no membro no se altera, como o caso do nome do autor contido no campo Autor:
63 Captulo 1

Introduo ao C# e .NET Framework


public static class Livro {
public static string Autor = "Alfredo Lotar";
}
Para acessar o campo Autor, simplesmente usamos o nome da classe, seguido do ponto
nal e do nome do campo.
Livro.Autor;
Exemplo completo:
// Arquivo de exemplo: membrosestaticos.cs
// Para compilar use: csc membrosestaticos.cs
using System;
public static class Livro {
public static string Autor = "Alfredo Lotar";
}
class TesteLivro {
static void Main() {
Console.WriteLine(Livro.Autor);
}
}
Obs.: classes estticas so abordadas tambm no captulo 2, no tpico Extension
Methods.
Classes estticas no so muito comuns. A prtica mais comum declarar alguns
membros da classe como estticos e outros no. Assim, no preciso declarar toda a
classe como static, somente os membros que no precisam estar associados a uma
instncia da classe. Exemplo:
public class Livro {
public static string Autor = "Alfredo Lotar";
public decimal PrecoUnitario(int frete, int precoNormal) {
return frete + precoNormal;
}
}
O nome do autor retornado por um campo static, mas o preo calculado com o
mtodo PrecoUnitario:
Livro lv = new Livro();
Console.WriteLine(lv.PrecoUnitario(12,40));
Console.WriteLine(Livro.Autor);
1.10.15 Estruturas structs
Uma struct semelhante a uma classe, mas um tipo de valor, enquanto uma classe
um tipo de referncia. Uma struct ideal para conter pequenos grupos de variveis,
pois cria objetos leves, conserva memria e nenhuma referncia adicional criada,
igual ao que acontece com objetos de classe.
64 Como Programar com ASP.NET e C#
As cpias de uma estrutura so criadas e automaticamente destrudas pelo compila-
dor. Assim, um construtor-padro e um destrutor so desnecessrios. Uma estrutura
pode conter construtores, constantes, campos, mtodos, propriedades, indexadores,
operadores, eventos e tipos aninhados.
Uma estrutura pode conter interfaces, contudo no pode ser herdada por outras
estruturas. As estruturas struct tm a mesma sintaxe de uma classe, embora sejam
mais limitadas.
public struct Livro {
// Cdigo aqui;
}
Obs.: o modicador protected no pode ser usado para declarar structs.
Para criar a instncia de uma struct, use a palavra-chave new:
Livro lv = new Livro("ASP.NET com C#","Alfredo Lotar");
Console.WriteLine("Ttulo: {0}\nAutor: {1}",lv.titulo,lv.autor );
Se preferir, declare o valor dos campos:
Livro lv;
lv.titulo = "ASP.NET com C#";
lv.autor = "Alfredo Lotar";
Console.WriteLine("Ttulo: {0}\nAutor: {1}",lv.titulo,lv.autor );
A estrutura utilizada no exemplo anterior a seguinte:
public struct Livro {
public string titulo;
public string autor;
public Livro(string tit, string aut) {
titulo = tit;
autor = aut;
}
}
As propriedades de uma estrutura so as seguintes:

Uma estrutura um tipo de valor, e uma classe um tipo de referncia.

Podemos criar a instncia de uma estrutura sem usar o operador new.

No pode conter construtores sem parmetros.

Pode implementar interfaces.

No permite inicializar instncias de campos.

No pode ser herdada por outras estruturas ou classes e no pode ser a base
de uma classe.
A instncia de uma classe passa uma referncia para um mtodo, enquanto a estrutura
passa uma cpia de si mesma.
65 Captulo 1

Introduo ao C# e .NET Framework


1.10.16 Mtodos
Um mtodo contm uma srie de instrues. Os mtodos so procedimentos que
tm a funo de executar as tarefas programadas dentro das classes.
Os mtodos devem ser declarados dentro de classes ou estrutura especicando o
nvel de acesso, o valor de retorno, o nome do mtodo e os parmetros (opcional).
Os parmetros devem estar dentro de parnteses e separados por vrgula. Parnteses
vazios indicam que o mtodo no requer qualquer parmetro. A sintaxe utilizada
pelos mtodos no C# a seguinte:
[modificador] tipo nome (Tipo parmetro)
Exemplo:
public class Taxas {
public void Imprimir() { }
public int Calculo(int x, int y) {return 0; }
public string Mensagem(string msg) {return msg; }
public dynamic ExampleMethod(dynamic d) {return d; }
}
1.10.16.1 Modifcadores de acesso de mtodos
Os modicadores de acesso dos mtodos so os mesmos utilizados com as classes.
Quando denimos a acessibilidade de um mtodo, devemos ter em mente que um
membro de uma classe ou struct no pode ter mais privilgios do que a classe ou
struct que a contm.
Exemplo: se uma classe for declarada com o modicador private, todos os seus mem-
bros sero private. Uma classe declarada como protected pode ter membros private,
internal, protect e protected internal.
Mtodos declarados dentro de uma classe sem um modicador de acesso so, por
padro, considerados private. Conra os modicadores de mtodos do C#:
Modifcadores Descrio
public O mtodo acessvel em qualquer lugar. No h restries.
private Acessvel apenas dentro do contexto em que foi declarado, o padro,
caso nenhum modicador seja especicado.
protected O mtodo acessvel somente na prpria classe e nas classes derivadas.
internal O mtodo acessvel somente no prprio Exe/DLL que a declarou.
protected internal a unio dos modicadores protected e internal.
Programadores com experincia em Visual Basic devem estar procurando um proce-
dimento Sub ou Function. No C#, mtodos cujo valor de retorno void so equivalentes
ao procedimento Sub do Visual Basic.
66 Como Programar com ASP.NET e C#
Mtodo Imprimir no C#:
public void Imprimir() {
// Cdigo aqui;
}
Procedimento Sub Imprimir no Visual Basic:
Public Sub Imprimir()
// Cdigo aqui
End Sub
Mtodos que retornam valores diferentes de void so, geralmente, chamados de funes.
Mtodo Calculo no C#:
public int Calculo() {
return 0;
}
Procedimento Function Calculo no Visual Basic:
Public Function Calculo() As Integer
Return 0
End Function
Chamamos um mtodo por intermdio da referncia ao objeto criado a partir da
classe que contm o mtodo, seguido de ponto nal, nome do mtodo e parnteses. Os
argumentos so listados dentro dos parnteses e separados por vrgula. No exemplo,
utilizamos novamente a classe Taxas, que contm os mtodos Imprimir, Calculo e Mensagem.
Exemplo:
Taxas objTax = new Taxas();
objTax.Imprimir();
objTax.Calculo(10, 20);
objTax.Mensagem("Ol mundo");
Se o tipo de retorno de um mtodo for diferente de void, ento o mtodo retornar um
valor com a palavra-chave return. Uma instruo que contm a palavra-chave return
retorna um valor para o mtodo que originou a chamada.
A palavra-chave return tambm utilizada para parar a execuo de um mtodo, e,
sem ela, a execuo encerrada somente no nal do bloco de cdigo.
Mtodos que contm um valor de retorno diferente de void devem obrigatoriamente
utilizar a palavra-chave return.
Exemplo 1 retorna uma string:
public string Mensagem(string str) {
return str;
}
67 Captulo 1

Introduo ao C# e .NET Framework


Exemplo 2 interrompe a execuo do mtodo se o parmetro str for nulo:
public string Mensagem(string str) {
if (str == null) {
return "";
}
else {
return str;
}
}
Para invocar um mtodo sem parmetros na mesma classe, basta digitar o nome do
mtodo seguido de parnteses.
Exemplo:
class Programa {
private int Calculo() {
return 10 * 5;
}
public int Valor() {
return Calculo();
}
}
Mtodos com parmetros devem conter os argumentos listados dentro dos parnteses
e separados por vrgula.
Exemplo:
class Programa {
private int Calculo(int x, int y) {
return x * y;
}
public int Valor() {
return Calculo(10,5);
}
}
1.10.16.2 Parmetros
Os mtodos podem conter parmetros que so utilizados para passar e, em alguns casos,
retornar valores de um mtodo. Quando declaramos um mtodo que contm parmetros,
devemos especicar o tipo de dados que o parmetro pode conter. aconselhvel no
declarar variveis e parmetros com o tipo Object, visto que a aplicao dever arcar com
o custo de uma converso de dados que, geralmente, consome alguns ciclos de CPU.
public int Calculo(int x,int y) { return x * y; }
public dynamic Calculo(dynamic x, dynamic y) { return x * y; }
Obs.: os nomes dos parmetros devem ser diferentes uns dos outros.
68 Como Programar com ASP.NET e C#
Passando parmetros por valor
possvel passar informaes a um mtodo por valor e por referncia. A diferena
a seguinte: os valores passados por referncia modicam os valores das variveis
passadas para o mtodo, enquanto um parmetro passado por valor a um mtodo
no modica esse valor.
A seguir, adaptamos o mtodo Calculo da classe Taxas para manipular parmetros por
valor. Vale ressaltar que todos os nossos exemplos at o momento passaram infor-
maes a mtodos por valor.
public class Taxas {
public int Calculo(int x, int y) {
x += 10;
return x * y;
}
}
Repare que o parmetro x recebe um incremento de 10 itens:
Taxas objTax = new Taxas();
dynamic a = 10;
int b = 20;
Console.WriteLine("Mtodo Calculo: " + objTax.Calculo(a, b));
Console.WriteLine("Varivel a: " + a);
Console.WriteLine("Varivel b: " + b);
Como a passagem dos parmetros foi realizada por valor, as variveis a e b no foram
alteradas. Veja o resultado do exemplo a seguir:
Mtodo Calculo: 400
Varivel a: 10
Varivel b: 20
Passando parmetros por referncia
Conforme foi dito anteriormente, os valores passados por referncia modicam os
valores das variveis passadas para o mtodo. Isso til em situaes em que os valores
das variveis passadas para o mtodo devem conter valores atualizados manipulados
pelo mtodo. Um exemplo: uma varivel que contm o nmero de itens de um carrinho
de compras. O total de itens pode ser passado a um determinado mtodo e atualizado
no momento em que novos itens forem adicionados ao carrinho de compras.
A seguir, temos a classe Shopping. Repare que o parmetro totalItens foi declarado com
a palavra-chave ref. Assim, informamos ao compilador que os valores sero passados
ao mtodo por referncia, com o parmetro totalItens:
public class Shopping {
public int AddNovoItem(ref int totalItens) {
totalItens += 1;
return totalItens;
}
}
69 Captulo 1

Introduo ao C# e .NET Framework


Em seguida, criamos uma instncia da classe Shopping e passamos a varivel xItens
por referncia. Novamente, necessrio utilizar a palavra-chave ref. A denio do
mtodo e a chamada do mtodo devem utilizar explicitamente a palavra-chave ref
para usar um parmetro ref.
Obs.: os parmetros passados por referncia precisam ser inicializados.
Shopping obj = new Shopping();
int xItens = 8;
Console.WriteLine("Mtodo AddNovoItem: " + obj.AddNovoItem(ref xItens));
Console.WriteLine("Varivel xItens: " + xItens);
O exemplo anterior retorna:
Mtodo AddNovoItem: 9
Varivel xItens: 9
O valor da varivel xItens foi alterado pelo mtodo AddNovoItem.
Parmetros out
Semelhante ao parmetro ref (por referncia), os parmetros out podem ser usados
com o objetivo de passar um resultado de volta para um mtodo. A varivel passada
ao mtodo no precisa ser inicializada, como acontece com os parmetros ref:
A seguir, reescrevemos o mtodo AddNovoItem da classe Shopping. Agora, temos um pa-
rmetro (totalItens) passado por valor e outro parmetro (saida) do tipo out:
public class Shopping {
public void AddNovoItem(int totalItens, out int saida) {
totalItens += 1;
saida = totalItens;
}
}
A chamada do mtodo ocorre da seguinte forma:
Shopping obj = new Shopping();
int xOut;
obj.AddNovoItem(8, out xOut);
Console.WriteLine("Varivel xOut: " + xOut);
Declaramos, alm da instncia da classe Shopping, a varivel xOut e, em seguida, cha-
mamos o mtodo AddNovoItem. Denimos os itens atuais do carrinho e utilizamos o
parmetro xOut com a palavra-chave out.
O tipo de retorno do mtodo AddNovoItem foi denido como void, ou seja, no retorna
valor; somente a varivel xOut contm o valor retornado pelo mtodo:
Console.WriteLine("Varivel xOut: " + xOut);
O valor retornado pela varivel xOut 9.
70 Como Programar com ASP.NET e C#
Argumentos nomeados
Um argumento nomeado associa o nome do parmetro a um determinado argumento.
Dessa forma, o programador no precisa lembrar a ordem dos parmetros na lista
de parmetros de um mtodo.
Obs.: voc pode usar argumentos nomeados com mtodos, indexadores,
construtores e delegates.
Por exemplo, no mtodo Calculo a seguir, temos o parmetro x e y:
public int Calculo(int x, int y) {
return x * y;
}
Quando invocamos o mtodo Calculo, podemos nomear os argumentos. Exemplo:
int resultado=Calculo(x: 5, y: 9);
Console.WriteLine(resultado);
Importante lembrar que os argumentos nomeados devem aparecer aps a denio
dos demais argumentos. Exemplo:
int resultado=Calculo(5, y: 9);
Console.WriteLine(resultado);
O exemplo a seguir gera um erro ao compilarmos a aplicao:
int resultado=Calculo(x:5, 9);
Console.WriteLine(resultado);
Para corrigir o erro na primeira linha, podemos refazer o exemplo usando:
int resultado=Calculo(x: 5, y: 9);
Ou ento:
int resultado=Calculo(5, y: 9);
ou simplesmente:
int resultado=Calculo(5, 9);
Argumentos opcionais
Agora no C# 4.0, temos a opo de omitir argumentos para alguns parmetros em
mtodos, indexadores, construtores e delegates. Exemplo:
public int Calculo(int x, int y=4) {
return x * y;
}
O segundo argumento opcional quando invocamos o mtodo calculo da seguinte forma:
int resultado=Calculo(5);
Console.WriteLine(resultado);
O exemplo retorna: 20
71 Captulo 1

Introduo ao C# e .NET Framework


Assim, o argumento x igual a 5, e o argumento opcional y 4.
Obviamente, voc no precisa usar sempre o valor padro do argumento opcional.
Por exemplo:
int resultado=Calculo(5,10);
retorna 50, pois o valor padro do argumento opcional ignorado.
1.10.16.3 Sobrecarga de mtodos
Cada membro usado por uma classe ou struct tem uma assinatura nica. A assinatura
de um mtodo composta pelo nome do mtodo e pela lista de parmetros.
Podemos declarar em uma mesma classe ou estrutura vrios mtodos com o mesmo
nome, mas com parmetros diferentes. Isso chamado de sobrecarga de mtodos,
cuja principal vantagem a exibilidade. Um nico mtodo, por exemplo, pode ter
vrias implementaes. Veja a seguir:
MessageBox.Show("Isto um teste");
MessageBox.Show("Ol mundo!", "Ttulo");
MessageBox.Show("Ol","Ttulo",MessageBoxButtons.YesNo);
MessageBox.Show("ltimo exemplo", "Ttulo", MessageBoxButtons.OK, MessageBoxIcon.Stop);
O mtodo Show da classe MessageBox implementado com um, dois, trs e quatro parmetros.
Obedea as seguintes regras ao usar a sobrecarga de mtodos:

Todos os mtodos sobrecarregados devem ter o mesmo nome.

Os mtodos devem ser diferentes entre si em pelo menos um dos seguintes itens:

Nmero de parmetros.

Ordem dos parmetros.

Tipo de dados dos parmetros.

O tipo de retorno (vlido somente em converses de operadores).
Exemplo:
public void Teste() {
System.Console.WriteLine("Mtodo Teste()");
}
public int Teste(int i) {
return i;
}
O exemplo completo tem quatro implementaes do mtodo Teste:
// Arquivo de exemplo: sobrecarga.cs
// Para compilar use: csc sobrecarga.cs
using System;
72 Como Programar com ASP.NET e C#
public class Livro {
public void Teste() {
System.Console.WriteLine("Mtodo Teste()");
}
public int Teste(int i) {
return i;
}
public string Teste(int a, string str) {
return str + " " + a;
}
public string Teste(string str, int a) {
return a + " " + str;
}
}
class TesteLivro {
static void Main() {
Livro lv = new Livro();
lv.Teste();
Console.WriteLine(lv.Teste(8));
Console.WriteLine(lv.Teste(10,"Segunda string"));
Console.WriteLine(lv.Teste("Primeira string",10));
}
}
O exemplo retorna os valores passados a cada implementao do mtodo Teste:
Mtodo Teste()
8
Segunda string 10
10 Primeira string
1.10.17 Constantes
As constantes tm valores conhecidos em tempo de compilao que no podem ser
modicados. So declaradas como campos e devem ser inicializadas no momento da
declarao; so declaradas com a palavra-chave const e sua sintaxe :
[modificador] const tipo nome = valor;
Exemplo:
class Livro {
public const int ano = 2012;
}
Uma constante deve ser do tipo sbyte, byte, short, ushort, int, uint, long, ulong, char, foat,
double, decimal, bool ou string, uma enumerao ou uma referncia para um valor nulo
(null).
Podemos declarar mltiplas constantes com o mesmo tipo de dados:
public class Livro {
public const int ano = 2010, mes = 09, dia = 12;
}
73 Captulo 1

Introduo ao C# e .NET Framework


Uma constante utiliza os modicadores de acesso public, private, protected, internal
ou protected internal.
O acesso s constantes realizado de forma direta (classe.constante), como se fosse
um membro esttico:
int data = Livro.ano;
1.10.18 Campos
O campo uma varivel declarada em uma classe, embora fora de qualquer mtodo,
e pode conter dados que so passados a uma classe ou struct. Sua sintaxe :
[modificador] tipo nome;
Exemplo:
public class Livro {
private string titulo;
private string autor = "Alfredo Lotar";
}
Obs.: recomendvel declarar um campo como private para que esteja acessvel
somente no contexto atual. O acesso a campos por classes externas deve ser realizado
por intermdio de mtodos, propriedades e indexadores.
Um campo pode ser denido como somente leitura, assemelhando-se a constantes.
Exemplo:
private readonly string autor = "Alfredo Lotar";
1.10.19 Namespaces espao para nome
H alguns anos, os programadores usavam listas contendo funes que poderiam ser
utilizadas para desenvolver um programa de computador. Quando precisava de uma
funo especca, o programador recorria lista em que encontrava as funes em
ordem alfabtica. Com um mnimo de esforo, era possvel localizar a funo desejada.
Essa abordagem, no entanto, praticamente impossvel, uma vez que o Windows
atingiu um nvel de complexidade inimaginvel e tem milhares de funes. Localizar
uma funo rapidamente tarefa muito difcil. Se impressas em ordem alfabtica,
teriam dezenas, seno centenas de pginas.
Para resolver esse problema, o .NET Framework utiliza espaos para nome. Todas as
suas bibliotecas de classes esto organizadas de modo hierrquico na forma de espao
para nome. A namespace System o principal espao para nome do .NET Framework,
o qual utiliza espao para nome a m de organizar uma grande quantidade de classes
de forma lgica e organizada, evitando, assim, conitos de nome de classes.
74 Como Programar com ASP.NET e C#
1.10.19.1 Utilizando espao para nome
Para utilizar uma determinada classe, devemos antes importar o espao para nome
que contm essa classe. Assim, indicamos em que espao para nome est a classe
ou a funo que queremos executar. No C#, isso feito com a palavra-chave using.
possvel tambm utilizar os membros de uma classe sem importar o espao para
nome. Nesse caso, utilizamos o nome qualicado completo. No nosso primeiro
exemplo, OlaMundo, utilizamos o nome qualicado completo do mtodo WriteLine:
System.Console.WriteLine("Ol Mundo!");
O grande problema de se utilizar um nome qualicado completo o excessivo esforo
de digitao que precisa ser despendido toda vez que se precisa utilizar um mtodo ou
uma propriedade. Quando importamos um espao para nome, podemos especicar
somente o nome do mtodo ou da propriedade que pretendemos utilizar. como no
mundo real. As pessoas no dia a dia utilizam apenas o primeiro nome para se referir
umas s outras e no o nome completo o tempo todo.
No nosso exemplo, poderamos importar a namespace System. Veja a seguir como ca
o exemplo OlaMundo:
// Nosso primeiro programa C#
/* programa Ol mundo
para compilar utilize csc OlaMundo.cs */
using System;
namespace OlaMundo {
class Ola {
static void Main() {
Console.WriteLine("Ol Mundo!");
}
}
}
Depois de importar o espao para nome System, observamos que a palavra System foi
omitida.
Console.WriteLine("Ol Mundo!");
Ao importar um espao para nome com a palavra-chave using, possvel denir um
alias (apelido).
using Alias = System.Collections;
Essa uma abordagem til em situaes em que devemos especicar o nome qua-
licado completo. Geralmente, isso acontece quando utilizamos herana de classes.
Assim, podemos escrever:
public class Form1 : Alias.ArrayList {
// ...
}
75 Captulo 1

Introduo ao C# e .NET Framework


Em vez de:
public class Form1 : System.Collections.ArrayList {
// ...
}
Obs.: todas as palavras-chave do C# so escritas em letras minsculas, exemplo:
using, else, if, do, for, foreach, in, while etc. No confundir palavras-chave do C#
com mtodos, classes e propriedades do .NET Framework. Por exemplo: Console
uma classe, e WriteLine um mtodo.
1.10.19.2 Criando uma namespace
Para criar um espao para nome, utilizamos a instruo namespace:
namespace Teste {
// ...
}
Um espao para nome pode conter: outras namespaces, classes, interfaces, estruturas,
enumeraes e delegate.
Para importar o espao para nome anterior, utilizamos:
using Teste;
O nome escolhido ao espao para nome deve indicar a funcionalidade disponvel
nos membros nele contidos. Exemplo, a namespace System.Net.Mail contm tipos que
permitem ao programador enviar e-mails.
A documentao do .NET Framework recomenda que os espaos para nome sejam
nomeados de acordo com o seguinte critrio:
<Empresa>.(<Produto>|<Tecnologia>)[.<Caracterstica>][.<Subnamespace>]
Utilizar o nome da empresa ou at seu prprio nome evita que empresas ou desen-
volvedores diferentes tenham namespaces com mesmo nome e prexo.
Alguns exemplos de namespaces:
Microsoft.WindowsMobile.DirectX
Microsoft.Csharp
Microsoft.VisualBasic.FileIO
AlfredoLotar.Livro.Aspnet
No segundo nvel, temos o produto ou a tecnologia e, a partir do terceiro nvel, a
caracterstica e as subnamespaces so opcionais.
1.10.20 Construtores
Sempre que uma classe ou struct criada, um construtor chamado. Construtores
so mtodos executados quando um objeto de determinado tipo criado. Possuem o
mesmo nome da classe em que esto contidos e no retornam valor, nem mesmo void.
76 Como Programar com ASP.NET e C#
Uma classe ou estrutura pode conter mltiplos construtores com diferentes argu-
mentos. Um construtor sem parmetros chamado de construtor-padro, invocado
sempre que a instncia de uma classe criada com a palavra-chave new.
Obs.: uma struct no pode conter construtores sem parmetros.
Usando construtores, um programador pode denir valores-padro ou denir os
valores iniciais dos membros. Exemplo:
public class Livro {
public string titulo;
public string autor;
public Livro() {
titulo = "ASP.NET com C#";
autor = "Alfredo Lotar";
}
}
No exemplo, a denio dos valores iniciais dos campos titulo e autor acontece no
construtor da classe Livro. Podemos reescrever o exemplo com novos construtores,
usando sobrecarga de mtodos. Exemplo:
public class Livro {
public string titulo;
public string autor;
public Livro() {
titulo = "ASP.NET com C#";
autor = "Alfredo Lotar";
}
public Livro(string tit,string aut) {
titulo = tit;
autor = aut;
}
}
E criar uma instncia da classe Livro usando o construtor-padro. Nesse caso, o valor
dos campos titulo e autor ser respectivamente: ASP.NET com C# e Alfredo Lotar:
Livro lv = new Livro();
Ou ento, podemos denir os valores iniciais dos campos no momento em que uma
instncia do objeto for criada:
Livro lv = new Livro("Livro sobre ASP.NET","Eu mesmo: Alfredo");
Os argumentos do construtor Livro denem os valores iniciais dos campos:
public Livro(string tit, string aut) {
titulo = tit;
autor = aut;
}
77 Captulo 1

Introduo ao C# e .NET Framework


Caso a classe Livro no seja declarada com um construtor, o construtor-padro auto-
maticamente fornecer valores iniciais para os campos declarados na classe:
public class Livro {
public string titulo;
public string autor;
public decimal preco;
}
Os valores iniciais de cada tipo foram abordados no incio deste captulo no tpico
sobre tipos de dados.
Os campos titulo e autor so denidos pelo construtor-padro como nulo (null), e o
campo preco, como zero.
1.10.20.1 Construtores private
Construtores cujo modicador private so uma categoria especial de construtores.
Geralmente, so usados em classes que tm somente membros estticos (static). o
mesmo que declarar uma classe como static.
No podemos criar a instncia de uma classe que contm somente construtores
denidos com o modicador private.
Declarar um construtor como private evita que o construtor-padro seja invocado.
Exemplo:
public class Livro {
private Livro() { }
public static string autor = "Alfredo Lotar";
}
O campo autor pode ser invocado dessa forma:
Console.WriteLine(Livro.autor);
A linha a seguir gera um erro ao tentarmos compilar o exemplo:
Livro lv = new Livro();
1.10.20.2 Construtores static
So construtores utilizados para iniciar dados de membros static ou executar determi-
nada ao uma nica vez. Um construtor do tipo static chamado automaticamente
antes de a primeira instncia da classe ser criada ou antes de qualquer membro
esttico ser referenciado.
Propriedades de um construtor static:
78 Como Programar com ASP.NET e C#

No possui qualquer modicador de acesso ou parmetro.

No pode ser invocado diretamente.

O programador no tem controle do momento em que o construtor static ser
executado dentro do programa.
Exemplo:
// Arquivo de exemplo: construtorstatic.cs
// Para compilar use: csc construtorstatic.cs
public class Livro {
static Livro() {
System.Console.WriteLine("O construtor static invocado.");
}
public static void Paginar() {
System.Console.WriteLine("O mtodo Paginar invocado.");
}
}
class TesteLivro {
static void Main() {
Livro.Paginar();
}
}
Aps a execuo, o exemplo retorna:
O construtor static invocado.
O mtodo Paginar invocado.
1.10.21 Destrutores
Um destrutor utilizado para destruir instncias de uma classe e tem as seguintes
propriedades:

No pode ser denido em structs, somente em classes.

Uma classe pode ter somente um destrutor.

No pode ser herdado nem sobrecarregado.

invocado automaticamente.

No tem modicadores ou parmetros.

declarado com o mesmo nome da classe, mas precedido do caractere ~.
Exemplo:
public class Livro {
~Livro() {
// Recursos para liberar aqui;
}
}
79 Captulo 1

Introduo ao C# e .NET Framework


O exemplo a seguir demonstra o funcionamento de um destrutor. A classe Autor
implementa, por meio de herana, a classe Livro:
// Arquivo de exemplo: destrutores.cs
// Para compilar use: csc destrutores.cs
using System;
public class Livro {
~Livro() {
Console.WriteLine("Libera recursos da classe base");
}
}
public class Autor:Livro {
~Autor() {
Console.WriteLine("Libera recursos da classe derivada Autor");
}
}
class TesteDestrutor {
static void Main() {
Autor aut = new Autor();
}
}
O exemplo retorna:
Libera recursos da classe derivada Autor
Libera recursos da classe base
O programador no tem controle sobre o destrutor, ou seja, o coletor de lixo do
.NET Framework decide o melhor momento para liberar os recursos. Para forar a
liberao imediata dos recursos utilizados, podemos invocar de forma explcita o
coletor de lixo. Exemplo:
GC.Collect();
Obs.: devemos ter cuidado especial com a performance da aplicao. Chamadas
excessivas ao coletor de lixo tm reexo negativo na performance da aplicao. Deixe
o coletor de lixo cuidar da liberao dos recursos que no esto sendo utilizados
pelo programa.
Recursos caros, que consomem muita memria, ciclos de CPU e largura de banda,
como conexes com banco de dados, redes, acesso a arquivos e internet etc., devem
liberar os recursos utilizados o mais rpido possvel e de forma explcita, usando o
mtodo Close ou Dispose.

Você também pode gostar