Escolar Documentos
Profissional Documentos
Cultura Documentos
ASP.NET e C#
Segunda edio 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 Agosto/2008 Julho/2007 Segunda edio Primeira reimpresso 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
(CIP)
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
captulo 1
O .NET Framework um componente integrado ao Windows que d suporte execuo 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 conflitos 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.
28
Gerenciamento automtico de memria. Verificao de segurana de tipos. Gerenciamento de excees. Segurana aprimorada. Acesso a metadados.
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 verificaes de segurana. Fornece acesso aos dados e internet. Permite desenvolver a interface de uma aplicao. Permite o desenvolvimento de aplicaes Windows e ASP.NET.
29
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# .
30
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 armazenados 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.Reflection.Emit.
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
1.7 Metadata
O metadata descreve tipos e membros contidos em uma aplicao. Quando convertemos 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. Identificao (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 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 uns 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 o MSIL no PE (.dll ou .exe) ou em um PE separado. Observe os tipos de assemblies na figura 1.1:
32
33
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).
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 figura 1.3:
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 figura 1.4:
34
O exemplo de compilao visto anteriormente a forma mais simples que existe, pois no especificamos o local nem o nome do arquivo executvel que estamos gerando, cujo nome pode ser definido 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 figura 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 figura 1.6.
Exemplo:
static void Main(string[] args) { System.Console.WriteLine("Ol Mundo!"); System.Console.Read(); }
35
1.10.1 Comentrios
Usamos comentrios para descrever partes complexas de cdigo, a fim de facilitar a manuteno tanto de quem elaborou o software quanto de terceiros. Comentrios no so interpretados pelo compilador C#. Podemos definir como um comentrio: textos, caracteres especiais, trechos de cdigo, nmeros etc. O C# 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#
36
static void Main() { // ... }
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
1.10.3 Sintaxe C#
Todas as instrues devem estar entre chaves e sempre ser finalizadas 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.
37
exemplo: classe, mtodo, namespace, diretiva etc. Neste captulo, todos esses termos sero explicados e exemplificados.
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.
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.
38
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 definir o tipo de dados e o escopo (local em que a varivel estar acessvel). O escopo definido pelos modificadores 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.
Exemplo:
string nome; int idade=50;
O tipo de dados tambm pode ser definido de forma implcita. Voc escreve a palavrachave var, e o C# define 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;
39
A palavra-chave var pode ser usada somente com variveis declaradas e inicializadas 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.
Os tipos de dados definem 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 verificaes 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 Office, 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.";
Intervalo -128 at 127 0 at 255 U+0000 at U+ffff -32,768 at 32,767 0 at 65,535 -2,147,483,648 at 2,147,483,647 0 at 4,294,967,295 -9,223,372,036,854,775,808 at 9,223,372,036,854,775,807 0 at 18,446,744,073,709,551,615
Tamanho Inteiro de 8 bits com sinal Inteiro de 8 bits sem sinal Caractere Unicode de 16 bits Inteiro de 16 bits com sinal Inteiro de 16 bits sem sinal Inteiro de 32 bits com sinal Inteiro de 32 bits sem sinal Inteiro de 64 bits com sinal Inteiro de 64 bits sem sinal
Valor padro 0 0 \0 0 0 0 0 0L 0
short int
Os tipos de ponto flutuante so: float, double, os quais diferem entre si na faixa e na preciso, conforme mostra a tabela 1.2:
Tabela 1.2 Tipos de ponto flutuante
Tipo
float double
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 definir um valor padro, caso o tipo seja nulo:
int d = x ?? 0;
41
Sem o sufixo m ou M, a varivel ser tratada como se fosse do tipo double. Um erro gerado em tempo de compilao.
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
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)
Uma varivel char pode conter sequncias de escape hexadecimal (prefixo \x) ou uma representao Unicode (prefixo \u):
char letra2 = '\x0072'; char letra3 = '\u0072'; // Hexadecimal // Unicode
43
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 especficas, 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
\' \" \\ \a \b \f \n \r \t \v
Significado
Apstrofo Aspas Barra invertida Alerta Retrocesso Avano de pgina Salto de linha Retorno de carro Tabulao horizontal 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;
Os tipos usados pelo C# podem ser manipulados por estruturas e classes (object e string) do .NET Framework:
Tipo C#
byte char bool
.NET Framework
System.Boolean System.Byte System.Char System.Sbyte
sbyte
44 Tipo C#
double float int uint long ulong short decimal
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 segundo 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 definido:
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
Para acessar o valor de vrios elementos ao mesmo tempo, preciso antes preparar a enumerao. O atributo System.FlagsAttribute deve ser usado na declarao da enumerao:
[Flags] public enum Dias { Segunda = 0x01, Quarta = 0x02};
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 nmeros 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";
46
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";
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++;
A tabela a seguir lista os operadores suportados pelo C#. As categorias so listadas em ordem de precedncia.
Categoria
Primrios Unrios Aritmticos Shift Relacional
Operadores
x.y, f(x), a[x], x++, x--, new, typeof, checked, unchecked, -> +, -, !, ~, ++x, --x, (T)x, true, false, &, sizeof *, /, %, +, <<, >> <, >, <=, >=, is, as
47
Operadores (cont.)
==, != & ^ | && || ?: =, +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>= ?? =>
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 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;
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 fim, a diviso 72 / 2 que igual a 36. O resultado armazenado na varivel x 36.
48
int int int int int 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
1.10.8.2 Operador %
O operador % retorna o resto de uma diviso. 13 % 5 igual a 3.
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)) { }
Exemplo:
if (5 < 10) {}
Retorna
5 > 10
true, pois
5 < 10:
Exemplo:
if (5 > 10) {}
49
Verificao 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) {}
as
Exemplo:
if (5 == 2) {} if (10 != 3) {}
50
Exemplo:
int x = 2000; Console.WriteLine(x >> 4); Console.WriteLine(x << 4); // Retorna 125 // Retorna 32000 >>, faremos o clculo manual
Para entender melhor como funciona o operador Shift at obtermos o valor 125. Observe o exemplo anterior.
O nmero 4 usado no segundo operando significa que devemos realizar quatro divises 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 fim, 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.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) comando;
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 condio 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
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); }
Em determinadas ocasies, voc pode querer executar comandos quando uma condio 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
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 definir diversas condies dentro de um bloco if. Isso pode ser feito com o auxlio da instruo else if. A instruo else if permite especificar outra condio a ser avaliada se a primeira condio for falsa. impossvel avaliar diversas condies utilizando apenas um bloco if. Devemos ressaltar que, independentemente do nmero de instrues que forem definidas 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
O argumento de teste definido com switch deve ser testado em 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, 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
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 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, sendo muito til em loops do tipo for.
Assim, 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
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
A varivel que serve como contador definida com o valor inicial, e, cada vez que o loop executado, o valor do contador incrementado (++) ou decrementado (--) e comparado com o valor final. No exemplo, se o valor do contador for maior do que o valor final, o programa saltar para a primeira linha aps a chave (}):
for (int i = 0; i <= 10; i++) { // cdigo aqui; } for (var i = 0; i <= 10; i++) { // cdigo aqui; }
A palavra-chave var pode ser usada tambm para inicializar blocos do tipo for:
Podemos sair de loop for usando a palavra-chave goto quando uma determinada condio for satisfeita. A palavra-chave goto redefine o fluxo do programa saltando para linhas predefinidas:
for (int i = 0; i <= 10; i++) { if (i == 5) { goto FluxoAqui; } } FluxoAqui:;
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
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 converte 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 executado 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 definir o contador com um valor negativo e inverter o valor inicial e o valor final. Veja a seguir:
for (int i = 10; i >= 1; i--) { Console.WriteLine(i.ToString()); }
57
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(); }
58
while(condio) { // Cdigo aqui; varivel (++ | --) }
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 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++; }
Um loop while ou do pode ser encerrado pelas palavras-chave throw. A palavra-chave continue tambm pode ser usada.
ou
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
Parmetro
elemento tipo coleo
Descrio
a varivel utilizada para percorrer os itens da coleo ou o array. o tipo de dados utilizado pela varivel (elemento). o objeto que contm o array ou a coleo.
1.10.14 Classes
As classes nos permitem organizar de forma coerente o cdigo que criamos. Por exemplo, 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 definem os dados e os comportamentos de um tipo de dados.
60
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 modificador 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 definido 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 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 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 defina um tipo de objeto. Podemos criar uma referncia para um objeto sem criar um objeto. Exemplo:
Taxas objTax;
61
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 final e o nome do membro. O exemplo a seguir acessa um membro (mtodo) chamado Calculo.
Taxas objTax = new Taxas(); objTax.Calculo();
Nesse caso, no h necessidade de se criar uma varivel. s vezes, usamos recursos compartilhados que consomem muitos recursos do sistema, 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 definimos explicitamente que um recurso deve ser liberado, fica 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; } }
62 Modificadores
public private
protected internal
protected internal
Os modificadores 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 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 { } }
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 associado 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
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; public static class Livro { public static string Autor = "Alfredo Lotar"; } class TesteLivro { static void Main() { Console.WriteLine(Livro.Autor); } }
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);
64
As cpias de uma estrutura so criadas e automaticamente destrudas pelo compilador. 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; }
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
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 especificando 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; } }
Descrio
O mtodo acessvel em qualquer lugar. No h restries. Acessvel apenas dentro do contexto em que foi declarado, o padro, caso nenhum modificador seja especificado. O mtodo acessvel somente na prpria classe e nas classes derivadas. O mtodo acessvel somente no prprio Exe/DLL que a declarou. a unio dos modificadores protected e internal.
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.
66
Procedimento Sub
Imprimir
no Visual Basic:
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:
Chamamos um mtodo por intermdio da referncia ao objeto criado a partir da classe que contm o mtodo, seguido de ponto final, 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 final 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
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 especificar 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 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
69
Em seguida, criamos uma instncia da classe Shopping e passamos a varivel xItens por referncia. Novamente, necessrio utilizar a palavra-chave ref. A definio 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);
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 parmetro (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; } }
Declaramos, alm da instncia da classe Shopping, a varivel xOut e, em seguida, chamamos o mtodo AddNovoItem. Definimos os itens atuais do carrinho e utilizamos o parmetro xOut com a palavra-chave out. O tipo de retorno do mtodo AddNovoItem foi definido como void, ou seja, no retorna valor; somente a varivel xOut contm o valor retornado pelo mtodo:
Console.WriteLine("Varivel xOut: " + xOut);
70
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.
Importante lembrar que os argumentos nomeados devem aparecer aps a definio dos demais argumentos. Exemplo:
int resultado=Calculo(5, y: 9); Console.WriteLine(resultado);
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 exemplo retorna: 20
71
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);
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; }
72
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)); } }
1.10.17 Constantes
As constantes tm valores conhecidos em tempo de compilao que no podem ser modificados. 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, 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; }
73
public, private, 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 definido como somente leitura assemelhando-se a constantes. , Exemplo:
private readonly string autor = "Alfredo Lotar";
74
O grande problema de se utilizar um nome qualificado 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 especificar 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 fica 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 definir um alias (apelido).
using Alias = System.Collections;
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:
public class Form1 : Alias.ArrayList { // ... }
75
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.
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 desenvolvedores diferentes tenham namespaces com mesmo nome e prefixo. 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
Uma classe ou estrutura pode conter mltiplos construtores com diferentes argumentos. 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 definir valores-padro ou definir 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 definio 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 definir 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");
77
Caso a classe Livro no seja declarada com um construtor, o construtor-padro automaticamente 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 definidos pelo construtor-padro como nulo (null), e o campo preco, como zero.
public class Livro { private Livro() { } public static string autor = "Alfredo Lotar"; }
78
No possui qualquer modificador 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(); } }
1.10.21 Destrutores
Um destrutor utilizado para destruir instncias de uma classe e tem as seguintes propriedades:
No pode ser definido em structs, somente em classes. Uma classe pode ter somente um destrutor. No pode ser herdado nem sobrecarregado. invocado automaticamente. No tem modificadores ou parmetros. declarado com o mesmo nome da classe, mas precedido do caractere ~.
Exemplo:
public class Livro { ~Livro() { // Recursos para liberar aqui; } }
79
Autor
O exemplo a seguir demonstra o funcionamento de um destrutor. A classe 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 reflexo 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.