Escolar Documentos
Profissional Documentos
Cultura Documentos
ASP.NET e C#
Alfredo Lotar
Novatec
captulo 1
25
crebro do .NET Framework. Pense nele como o agente que gerencia o cdigo em tempo de execuo, provendo servios como, por exemplo, o gerenciamento de memria.
Veja os benefcios que o CLR nos proporciona:
Gerenciamento automtico de memria.
Verificao de segurana de tipos.
Gerenciamento de excees.
Segurana aprimorada.
Acesso a metadados.
26
27
Como a converso do MSIL para cdigo nativo acarreta consumo de tempo e memria,
ela 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 cdigo
nativo. O MSIL convertido usado durante a execuo e armazenado para que esteja
acessvel para chamadas subseqentes.
Imagine, por exemplo, que voc tenha uma classe com cinco mtodos; quando voc
chamar o primeiro mtodo, somente este ser compilado, e, quando precisar de outro
mtodo, este tambm ser compilado. Chegar um momento em que todo o MSIL
estar em cdigo nativo.
1.6 Assemblies
Assemblies so a parte fundamental da programao com .NET Framework. Um
assembly 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. Assemblies estticos podem incluir vrios
tipos (interfaces e classes) do .NET Framework, como tambm recursos para assemblies
(bitmaps, arquivos jpeg etc.). 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 armazenados em disco.
Podemos salvar em disco assemblies dinmicos aps sua execuo.
Um assembly pode ser criado usando o Visual Studio ou outras ferramentas disponibilizadas pelo .NET Framework SDK. Assemblies dinmicos podem ser criados com
as classes da namespace System.Reflection.Emit.
28
1.7 Metadata
O metadata descreve tipos e membros contidos numa aplicao. Quando convertemos o
cdigo C# num Portable Executable PE, o metadata inserido em uma poro deste
arquivo, enquanto o cdigo convertido para MSIL e inserido em outra poro deste
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.
Identificao (nome, verso, cultura, chave pblica).
Os tipos que so exportados.
Outros assemblies das quais este 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 modificam 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 um com os outros. O assembly
manifest contm todo o metadata necessrio para o assembly definir verso, identificar
aspectos relativos segurana e referncias para recursos e classes. O manifest pode
ser armazenado junto com MSIL no PE (.dll ou .exe) ou num PE separado. Observe os
tipos de assemblies na Figura 1.1:
29
30
1.10.1 Comentrios
Usamos comentrios para descrever partes complexas de cdigo, a fim de facilitar a
manuteno de quem elaborou o software e de terceiros. Comentrios no so interpretados pelo compilador C#. Podemos definir como um comentrio: textos, caracteres
especiais, trechos de cdigo, nmeros etc.
O C# nos permite definir comentrios de duas maneiras: usando barras duplas (//)
ou os caracteres /* e */.
Barras duplas (//) convertem o restante da linha em comentrios:
// Nosso primeiro programa C#
31
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;
}
1.10.3 Sintaxe C#
Todas as instrues devem estar entre chaves e sempre ser finalizadas com um pontoe-vrgula, como voc ver a seguir:
{
}
// Cdigo aqui;
32
OlaMundo.cs.
Se tudo estiver correto e no houver nenhum erro de sintaxe, aparecer apenas uma
mensagem contendo a verso do compilador C# e informaes sobre copyright. Se
houver algum erro, ser retornada uma mensagem informando a linha onde est o erro,
como pode ser visto na Figura 1.4.
33
O exemplo de compilao que vimos anteriormente a forma mais bsica que existe,
pois no especificamos o local, nem o nome do arquivo executvel que estamos gerando,
cujo nome pode ser definido como no 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 Figura 1.6:
Para facilitar a explicao de um bloco ou linha de cdigo, no inserimos junto com o cdigo uma classe e um mtodo Main, ou seja, o cdigo no est pronto para 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.
34
class Teste {
static void Main() {
for (int i = 10; i >= 1; i--) {
Console.WriteLine(i.ToString());
}
}
}
struct NossaStruct {
}
interface INossaInterface {
}
1.10.7 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 possam ser atribudos valores a ela. Alm
do nome, devemos tambm definir o tipo de dados e o escopo (local onde a varivel
estar acessvel). O escopo definido pelos modificadores de acesso.
35
Exemplo:
string nome;
int idade=50;
Os tipos de dados definem a quantidade de memria que ser reservada para a varivel.
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.
types
e reference
types.
types
so
Variveis baseadas em tipos de valor (value types) contm diretamente o valor. Quando
copiamos uma varivel para outra, uma cpia do valor passado, enquanto em tipos
de referncia (reference types) somente uma referncia do objeto passada.
Os values types se dividem em duas categorias principais: estruturas (structs) e enumeraes (enum).
As estruturas struct se dividem em tipos numricos (tipos integrais, ponto flutuante
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:
36
Intervalo
Tamanho
Valor padro
sbyte
-128 at 127
byte
0 at 255
char
U+0000 at U+ffff
\0
short
-32,768 at 32,767
ushort
0 at 65,535
int
-2,147,483,648 at 2,147,483,647
uint
0 at 4,294,967,295
long
-9,223,372,036,854,775,808
at 9,223,372,036,854,775,807
0L
ulong
0 at 18,446,744,073,709,551,615
Os tipos de ponto flutuante so: float, double, os quais diferem entre si na faixa e na
preciso. como mostra a Tabela 1.2:
Tabela 1.2 Tipos de ponto flutuante
Tipo
Intervalo aproximado
Preciso
Valor padro
float
1.5e-45 at 3.4e38
7 digitos
0.0F
double
5.0e-324 at 1.7e308
15-16 digitos
0.0D
Uma varivel char pode conter seqncias de escape hexadecimal (prefixo \x) ou uma
representao Unicode (prefixo \u):
char letra2 = \x0072; // Hexadecimal
char letra3 = \u0072; // Unicode
Combinaes de caracteres que consistem de uma barra invertida (\) seguida de uma
letra ou combinao de dgitos so chamadas de seqncia de escape. Seqncias de
escape so usadas em situaes especficas como: salto de linha, retorno de carro,
37
Significado
Apstrofo
Aspas
Barra invertida
Alerta
Retrocesso
Avano de pgina
Salto de linha
Retorno de carro
Tabulao horizontal
Tabulao vertical
\
\\
\a
\b
\f
\n
\r
\t
\v
Uma varivel precisa ser inicializada antes que possa ser utilizada. Se voc declarar uma
varivel sem declarar um valor inicial, como, por exemplo,
int x;
Isso equivalente a:
int x = 0;
Sem o sufixo m ou M, a varivel ser tratada como sendo do tipo double. Um erro gerado
em tempo de compilao.
38
Os tipos usados pelo C# podem ser manipulados por struct e classes (object e string)
do .NET Framework.
Tipo C#
.NET Framework
bool
System.Boolean
sbyte
System.Sbyte
byte
char
decimal
double
float
int
uint
long
ulong
object
short
ushort
string
System.Byte
System.Char
System.Decimal
System.Double
System.Single
System.Int32
System.UInt32
System.Int64
System.UInt64
System.Object
System.Int16
System.UInt16
System.String
39
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
Para acessar o valor de vrios elementos ao mesmo tempo, temos antes que preparar a enumerao. O atributo System.FlagsAttribute deve ser usado na declarao da enumerao:
[Flags]
public enum Dias { Segunda = 0x01, Quarta = 0x02};
40
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;
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;
1.10.9 Converses
Uma tarefa muito comum no mundo da programao a utilizao de converses. Por
exemplo: podemos converter um inteiro para um longo. Quando o usurio digita um
nmero qualquer numa TextBox, necessrio uma converso de valores antes que um
clculo possa ser realizado.
Quando o valor numrico se encontra num controle TextBox, ele uma string e, como
voc sabe, no podemos realizar clculos com strings, ento a soluo converter essa
string para um tipo numrico, como, por exemplo Int32, e depois realizar o clculo. Nem
41
todas as strings podem ser convertidas para valores numricos. Veja o caso da string
Estou escrevendo. impossvel convert-la, pois uma frase, bem diferente de 54,
que se transforma aps a converso no inteiro 54.
Voc pode estar se questionando como saber se pode converter determinado valor
para outro sem causar erros. Alguns tipos so convertidos automaticamente se o valor
que receber a converso puder conter todos os valores da expresso. A tabela a seguir
nos mostra as converses que so realizadas automaticamente:
De
Para
sbyte
short
byte
ushort
int
uint
long
ulong
char
float
Note que, convertemos o valor inserido no mtodo ReadLine para um tipo int32.
A seguir, temos as converses explcitas possveis:
De
Para
sbyte
short
byte
sbyte e char
ushort
uint
int
long
ulong
char
float
double
decimal
sbyte, byte, short, ushort, int, uint, long, ulong, char, ou decimal
sbyte, byte, short, ushort, int, uint, long, ulong, char, float, ou decimal
sbyte, byte, short, ushort, int, uint, long, ulong, char, float, ou double
s vezes, quando fazemos uma converso explcita, ocorrem certos erros, pois, em
situaes normais, impossvel converter, por exemplo, um tipo double para byte sem
haver perda de dados.
42
Podemos controlar se houve ou no algum erro por overflow (valor muito alto) utilizando as instrues checked e unchecked.
A seguir, veremos dois exemplos: um com a instruo unchecked e outro com a instruo
checked.
// Arquivo de exemplo: unchecked.cs
// Para compilar utilize: csc unchecked.cs
using System;
public class unchecked1 {
public static void Main() {
int a;
short b;
a = 35000;
unchecked {
b = (short) a;
Console.Write(b);
}
}
}
Nesse exemplo, convertemos um valor (35000) de inteiro para short. O valor retornado :
-30536
Nenhum valor retornado, e sim uma mensagem. Uma forma bem mais prtica de se
fazer converses utilizar os mtodos da classe Convert.
Mtodo
Descrio
ToBoolean
ToByte
ToChar
ToDateTime
ToDecimal
ToDouble
ToSingle
ToString
43
1.10.10 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 de
nome. Uma expresso pode conter um valor literal, invocar um mtodo, operador ou
varivel.
Um operador um termo ou smbolo que pode ser usado com uma ou mais expresses,
chamadas de operandos. Um operador que possui somente um operando chamado
de operador unrio., um operador com dois operandos, por sua vez, chamado de
operador binrio.
Operador unrio (++)
x++;
Operadores
Primrios
Unrios
Aritmticos
Shift
Relacional
Igualdade
E lgico
OU exclusivo lgico
OU lgico
E condicional
OU condicional
Condicional
Atribuio
44
Voc pode criar suas prprias equaes, na quais possvel utilizar combinaes de
operadores. Ao combinar operadores, devemos obedecer a sua precedncia, ou seja,
devemos obedecer ordem de processamento dos operadores para realizar os clculos
corretamente. Essa ordem conhecida como precedncia de operadores. Entender
como funciona a precedncia de operadores fundamental para se realizar clculos
corretamente. Quando dois operadores com a mesma precedncia esto presentes em
uma expresso, eles so avaliados da esquerda para direita.
int x = 2 + 5 * 8;
Por exemplo, se voc executar o clculo da esquerda para a direita, neste 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;
v
d
r
s
m
=
=
=
=
=
2 * 3;
6 / 3;
13 % 5;
5 + 3;
5 - 3;
//
//
//
//
//
retorna
retorna
retorna
retorna
retorna
6
2
3
8
2
45
Retorna
true, pois
5 > 10
E, por ltimo, o operador as realiza converses entre tipos de referncia (reference types)
compatveis.
object obj = Alfredo;
string x = obj as string;
Operadores de igualdade ==, != tambm retornam valores booleanos referentes comparao realizada entre os operandos.
5 == 2
10 != 3
//
//
//
//
//
//
Atribui 8 a varivel x
Incrementa e armazena o novo valor de x
Decrementa e armazena o novo valor de x
Multiplica e armazena o valor atual de x. Igual x*8
Divide e armazena o valor atual de x. Igual x/2
Armazena o resto da diviso em x. Igual x%3
Ambos os operandos dos operadores Shift devem ser um tipo integral. O primeiro
operando se desloca conforme a quantidade de bits definida no segundo operando.
O operador >> faz com que o deslocamento seja para direita, enquanto o operador <<
realiza o deslocamento para esquerda.
int x = 2000;
Console.WriteLine(x >> 4); // Retorna 125
Console.WriteLine(x << 4); // Retorna 32000
46
>>, faremos
o clculo manual
O nmero 4 usado no segundo operando significa que devemos realizar quatro divises
por 2. Exemplo: 2000 / 2 igual a 1000; 1000 / 2 igual a 500; 500 / 2 igual a 250; e,
por fim, 250 / 2 125. O operador <<, por sua vez, requer uma multiplicao por 2.
1.10.11.1 Instruo if
A instruo if utilizada para verificar 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) comandos;
Alm da instruo if, possvel testar a condio de uma expresso com o operador ?:
Sintaxe:
condio ? expresso1 : expresso2;
Se a condio for verdadeira, a primeira expresso executada; caso seja falsa, a segunda
expresso executada.
int a = 2;
string mensagem = a > 1 ? Condio verdadeira : Condio falsa;
Console.WriteLine(mensagem);
47
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...
}
claro que podemos executar comandos quando uma condio falsa. Em determinadas
ocasies, pode ser que voc deseje executar comandos quando uma condio for falsa.
H duas formas bsicas de se 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
}
48
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());
49
O argumento de teste definido com switch deve ser testado por comparao com os valores 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, mas 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;
}
}
}
s vezes no podemos prever todos os valores possveis do argumento de teste. Neste caso,
utilizamos a instruo default dentro do bloco switch para realizar uma ao especfica
caso nenhuma instruo case corresponda ao argumento de teste. A instruo default
opcional. A palavra-chave goto transfere o controle para uma clusula case especfica ou
para a clusula default e muito til em loops do tipo for.
50
tiver mais de 18 anos, ento o valor da mensalidade igual a R$ 500. Como podemos ver,
a mensalidade do aluno s definida quando as condies dos dois argumentos foram
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;
}
Como podemos observar, a varivel somente definida com o valor decimal 500 quando
as duas condies forem verdadeiras. Na tabela a seguir, temos os principais operadores
condicionais utilizados no C#:
Operador
Descrio
&&
||
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);
}
}
51
for(tipo Contador = ValorInicial; Contador (< | > | >= | <=) ValorFinal; Contador(++ | --)) {
// cdigo aqui;
}
A varivel que serve como contador definida com o valor inicial, e, a cada vez que
o loop executado, o valor do contador incrementado (++) ou decrementado (--)
e comparado com o valor final. Se o valor do contador for maior que o valor final, o
programa salta para a primeira linha aps a chave (}).
for (int 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 faz o programa saltar para a linha onde est a marca.
Marca, etiqueta ou label nada mais do que uma instruo definida pelo programador
com o objetivo de redefinir o fluxo do programa.
for (int i = 0; i <= 10; i++) {
if(i == 5) {
goto FluxoAqui;
}
}
FluxoAqui:;
A palavra-chave continue muito interessante, pois nos 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. Neste caso, poderamos utilizar a palavra-chave
continue para saltar para o prximo bloco. Assim somente os nmeros mpares seriam
impressos na tela.
for (int i = 0; i <= 10; i++) {
if(i % 2 == 0) {
continue;
}
Console.WriteLine(i.ToString());
}
Exemplo completo:
// Arquivo de exemplo: forteste.cs
// Para compilar use: csc forteste.cs
using System;
class TesteFor {
static void Main() {
52
O exemplo a seguir imprime dez vezes o contedo da varivel i e cem 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 definir o contador com um valor negativo.
Veja a seguir:
for (int i = 10; i >= 1; i--) {
Console.WriteLine(i.ToString());
}
Alm de usar o operador i--, devemos inverter o valor inicial e o valor final.
53
ou false). Assim como acontece com a instruo if, a condio pode ser uma funo,
uma varivel booleana ou uma expresso.
Se a condio for verdadeira, as instrues colocadas dentro do bloco {} sero executadas, e o programa novamente avaliar a condio. Logo que a condio se torna falsa,
o programa passa a executar as instrues colocadas aps a chave (}).
int i = 0;
while(i <= 10) {
Console.WriteLine(i.ToString());
i++;
}
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.14.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 so
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, no mnimo, uma vez, utilize a palavra-chave do.
Isso garante que a instruo seja executada, pelo menos, uma vez, antes de avaliar se
h necessidade de repetir ou no o loop. Sintaxe da instruo do:
do {
// Cdigo aqui
varivel (++ | --)
}
while (condio);
Exemplo:
54
int x = 0;
do {
Console.WriteLine(x);
x++;
}
while (x <= 10);
Parmetro
Descrio
elemento
tipo
coleo
1.10.16 Classes
As classes nos permitem organizar de forma coerente o cdigo que criamos. Por exemplo,
podemos criar uma classe chamada custos que contm todas as funes necessrias
para manipular os clculos referentes aos custos de uma empresa. Quando criamos
uma aplicao, podemos criar diversas classes para facilitar a manuteno. No nosso
exemplo, a classe Ola contm o mtodo Main.
Uma classe o tipo de dados mais poderoso do C#. Classes definem os dados e comportamentos de um tipo de dados.
Os membros de uma classe podem ser: construtores, destrutores, constantes, campos, mtodos, propriedades, indexadores, operadores, eventos, delegates, classes, interfaces, structs.
Uma classe declarada com a instruo class e pode ser precedida de um modificador
de acesso. Sintaxe:
[modificador] class nome {
}
55
Exemplo:
public class Taxas {
// cdigo aqui;
}
Para acessar os membros de uma classe, devemos criar 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, e o comportamento dos
objetos definido pelos mtodos e interfaces do objeto. Lembrando que dois objetos
idnticos podem no conter os mesmos dados.
Algumas caractersticas dos objetos em C#.
Tudo que voc usa em C# um objeto, inclusive formulrios Windows (Windows
Forms) e controles.
So definidos como modelos de classes e structs.
Usam propriedades para obter e modificar informaes que contm.
Tm mtodos e eventos que permitem executar aes.
So herdados da classe Object.
Os objetos so definidos por classes e structs 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 uma instncia de uma classe criada, uma referncia para o objeto passada
para o programador. No exemplo anterior, objTax uma referncia para um objeto baseado na classe Taxas. A classe define um tipo de objeto, mas no um objeto.
Podemos criar uma referncia para um objeto sem criar um objeto. Exemplo:
Taxas objTax;
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 voc criar uma instncia da classe
com a palavra-chave new, e, em seguida, usar a referncia para o objeto seguido de um
ponto final e o nome do membro. O exemplo a seguir acessa um membro (mtodo)
chamado Calculo.
Taxas objTax = new Taxas();
ObjTax.Calculo();
56
Obs: somente as classes que implementam a interface IDisposable podem ser utilizadas
pelo bloco using. A interface IDisposable possui um mtodo chamado Dispose que
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;
}
}
Descrio
public
57
Os tipos aninhados so private por padro e podem acessar membros definidos como
private e protected da classe em que esto contidos. Devemos usar o nome qualificado
completo para acessar os membros de classes aninhadas. Exemplo:
public class Taxas {
public class Juros {
}
}
Para acessar o campo Autor, simplesmente usamos o nome da classe, seguido do ponto
final e do nome do campo.
Livro.Autor;
Exemplo completo:
// Arquivo de exemplo: membrosestaticos.cs
// Para compilar use: csc membrosestaticos.cs
using System;
58
static,
structs.
As estruturas struct possuem a mesma sintaxe de uma classe, embora sejam mais
limitadas que as classes.
public struct Livro {
// Cdigo aqui;
}
59
Assim como podemos criar uma instncia de uma classe, podemos tambm criar uma
instncia de uma struct, usando a palavra-chave new.
Livro lv = new Livro(ASP.NET com C#,Alfredo Lotar);
Console.WriteLine(Ttulo: {0}\nAutor: {1},lv.titulo,lv.autor );
1.10.19 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 struct especificando o nvel de
acesso, o valor de retorno, o nome do mtodo e parmetros (opcional). Os parmetros
devem estar dentro de parnteses e separados por vrgula. Parnteses vazios indicam que
o mtodo no requer nenhum parmetro. Sintaxe utilizada pelos mtodos em C#.
[modificador] tipo nome (Tipo parmetro)
60
Exemplo:
public class Taxas {
public void Imprimir() { }
public int Calculo(int x, int y) {return 0; }
public string Mensagem(string msg) {return msg; }
}
Descrio
public
Programadores com experincia em Visual Basic devem estar procurando um procedimento Sub ou Function. No C#, mtodos cujo valor de retorno void so equivalentes
ao procedimento Sub do Visual Basic.
Mtodo Imprimir no C#.
public void Imprimir() {
// Cdigo aqui;
}
Procedimento Sub
Imprimir
no Visual Basic.
Mtodos que retornam valores diferentes de void so, geralmente, chamados de funes.
61
Procedimento Function
Calculo
no Visual Basic:
void
devem obrigatoriamente
62
1.10.19.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 especificar o tipo de dados que o parmetro pode conter. aconselhvel no
declarar variveis e parmetros com o tipo Object, pois 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){}
Obs: os nomes dos parmetros devem ser diferentes uns dos outros.
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
63
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 foram 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;
}
}
64
O mtodo Show da classe MessageBox implementado com um, dois, trs e quatro parmetros.
Obedea as seguintes regras ao usar 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());
}
65
1.10.20 Constantes
Constantes possuem valores conhecidos em tempo de compilao, mas no podem ser
modificados, so declaradas como campos e devem ser inicializadas no momento da
declarao; so declaradas com a palavra-chave const. Sintaxe:
[modificador] const tipo nome = valor;
Exemplo:
class Livro {
public const int ano = 2007;
}
66
Uma constante deve ser do tipo sbyte, byte, short, ushort, int, uint, long, ulong, char, float, 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;
}
1.10.21 Campos
Campo uma varivel declarada em uma classe, mas fora de qualquer mtodo, que
pode conter dados que so passados a uma classe ou struct. Sintaxe:
[modificador] tipo nome;
Exemplo:
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 declarado como sendo somente leitura, assemelhando-se a constantes.
private readonly string autor = Alfredo Lotar;
67
System,
System
foi
Console.WriteLine(Ol Mundo!);
using,
Essa uma abordagem til em situaes em que devemos especificar o nome qualificado completo. Geralmente, isso acontece quando utilizamos herana de classes. Assim
podemos escrever:
68
Em vez de:
public class Form1 : System.Collections.ArrayList {
// ...
}
struct,
enu-
Utilizar o nome da empresa ou at o seu prprio nome previne que empresas ou desenvolvedores diferentes tenham namespaces com o mesmo nome e prefixo.
Alguns exemplos de namespaces:
Microsoft.WindowsMobile.DirectX
Microsoft.Csharp
Microsoft.VisualBasic.FileIO
Alfredo.AdeusSpam
No segundo nvel, temos o produto ou a tecnologia e, a partir do terceiro nvel, a caracterstica e as subnamespaces so opcionais.
69
1.10.23 Construtores
Sempre que uma classe ou struct criada, um construtor chamado. Construtores
so mtodos executados quando um objeto de um determinado tipo criado. Eles
possuem o mesmo nome da classe em que esto contidos e no retornam valor, nem
mesmo void.
Uma classe ou struct pode conter mltiplos construtores com diferentes argumentos.
Um construtor sem parmetros chamado de construtor-padro, invocado sempre que
uma instncia de uma classe criada com a palavra-chave new.
Obs: uma struct no pode conter construtores sem parmetros.
titulo
autor,
acontece no
Podemos criar uma instncia da classe Livro usando o construtor-padro. Neste caso,
o valor dos campos titulo e autor ser respectivamente: ASP.NET com C# e Alfredo
Lotar.
Livro lv = new Livro();
70
Podemos tambm criar uma instncia definindo os valores iniciais dos campos no
momento em que uma instncia do objeto criada.
Livro lv = new Livro(Livro sobre ASP.NET,Eu mesmo: Alfredo);
Caso a classe Livro no seja declarada com um construtor, o construtor-padro automaticamente prov 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 definidos pelo construtor-padro como nulo (null) e o
campo preco, como zero.
private
71
static
ser
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();
}
}
1.10.24 Destrutores
Um destrutor utilizado para destruir instncias de uma classe e possui as seguintes
propriedades:
No pode ser definido em structs, somente em classes.
Uma classe pode ter somente um destrutor.
Destrutores no podem ser herdados nem sobrecarregados.
So invocados automaticamente.
No possuem modificadores ou parmetros.
Um destrutor declarado com o mesmo nome da classe, mas precedido do caractere ~.
72
Exemplo:
public class Livro {
~Livro() {
// Recursos para liberar aqui;
}
}
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
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 os
mtodos Close ou Dispose.