Documente Academic
Documente Profesional
Documente Cultură
Sumrio
1.
2.
5.
A interface IClonable............................................................................................................ 91
A interface IComparable ...................................................................................................... 92
Exerccio Prtico 1 Implementando Interfaces .................................................................. 93
6.
7.
8.
9.
1.
Construindo Aplicaes em C#
Para construirmos aplicaes em .NET, uma ferramenta fundamental que deve ser instalada
em nossa estao de trabalho o .NET Framework Sdk. Este pacote de ferramentas prepara a
mquina no s para permitir a execuo de aplicaes .NET como tambm permite o
desenvolvimento de tais aplicaes. O SDK acompnha a maioria das ferramentas de
deseenvolvimento (como o Visual Studio.NET), mas exista a opo de no utilizar uma IDE de
desenvolvimento, sua instalao totalmente recomendada.
Uma srie de ferramentas acompanha o .NET Framework Sdk. Estas ferramentas permitem a
execuo de uma srie de tarefas relacionadas ao desenvolvimento de aplicaes, como a
importao de web services, a gerao de classes, a visualizao de DLLs, etc.
O .NET Framework SDK encontra-se em geral na pasta C:\Arquivos de programas\Microsoft
Visual Studio 8\SDK\v2.0. Nesta pasta voc encontra um arquivo StartHere.HTM que
considerado o ponto de entrada para a documentao do SDK do .NET Framework.
O compilador csc.exe
Tendo um arquivo com cdigo fonte .cs, para que este arquivo se torne efetivamente um
programa, precisamos que este arquivo seja compilado. Caso estejamos trabalhando apenas com o
.NET Framework SDK, temos que trabalhar com o compilador de linha de comando, o csc.exe.
lgico que voc no ir criar os seus programas utilizando esta ferramenta, mas o conhecimento
dela pode ser til em situaes em que a IDE de desenvolvimento no esteja disponvel. Outro
ponto impotante que a ferramenta de desenvolvimento na realidade utiliza o compilador de linha
de comando para efetuar a compilao dos programas.
O parmetro out indica o nome do arquivo compilado que ser gerado (em geral um arquivo
com a extenso .DLL ou .EXE). A opo target indica o tipo de arquivo (exe para executvel e lib
para arquivos dll).
1. Na rea de trabalho, clique com o boto direito sobre o cone Meu Computador e
selecione a opo Propriedade
2. Clique na aba Avanado
3. Clique no boto variveis de ambiente
C:\Windows\Microsoft.NET\Framework\v2.0.50727
csc /?
1. Inicie o Notepad
2. Digite o seguinte contedo no arquivo
using System;
namespace Modulo01
{
class Program
{
static void Main()
{
Console.WriteLine("Bem vindo ao C#;");
}
}
}
4. Verifique que o arquivo Modulo01.exe foi criado. Caso no tenha sido criado,
verifique se voc digitou corretamente a estrutura do programa
5. Execute o programa digitando Modulo01 no prompt de comando
O Visual Studio .NET traz um editor de interface para pginas ASP.NET muito familiar com
o editor de interface para o Visual Basic, a inteno que os desenvolvedores Visual Basic se
sintam vontade para criar Web Forms como se estivessem criando Windows Forms.
possvel criar pgina apenas arrastando controles da caixa de ferramentas para dentro da
pgina, assim como qualquer editor WYSIWYG, a grande diferena que, como nos editores
Windows Forms, clicando duas vezes sobre um controle, o Visual Studio automaticamente cria um
manipulador para um evento daquele controle.
Tambm possvel criar pginas ASP.NET utilizando a linguagem HTML, basta apenas
alterar a forma de visualizao da pgina, as funcionalidades fornecidas pelo editor visual so as
mesmas, ou seja, tambm possvel arrastar controles para dentro do HTML e alterar suas
propriedades utilizando a caixa de propriedades. Alm disso o Visual Studio .NET ir fornecer uma
ambiente de codificao HTML muito rico e poderoso.
Como falado anteriormente, para criar uma aplicao em ASP.NET o desenvolvedor utilizar
uma das linguagens disponveis no .NET Framework, e utilizar todos os seus recursos, sem
excees, portanto o editor de cdigo envolvendo lgica da pgina, ser o mesmo utilizado para
construir Windows Forms.
Desta forma, mesmo que o desenvolvedor no saiba a linguagem HTML, ele estar apto a
criar pginas Web Forms sem problemas, j que ele ter um editor de interface to poderoso quanto
o do Windows Forms e poder criar a lgica da aplicao exatamente como cria a lgica em
formulrios Windows Forms. Outro detalhe importante, que mesmo sem ele nunca ter
acompanhado o problema de compatibilidade entre navegadores, ele pode criar a pgina sem
problemas, porque quem vai se preocupar com isso por ele o ASP.NET.
O Visual Studio 2005 traz integrado a seu sistema, um web server totalmente desvinculado
ao IIS. Agora, aqueles que no tem IIS instalado em seus computadores, podem utilizar o Visual
Studio 2005 para criar seus sites e web services e execut-los facilmente.
O web server integrado, seguro pois no permite acesso por parte de outras mquinas
(somente a maquina que esta rodando o Visual Studio pode acess-lo), e possui acesso atravs de
portas randmicas.
Solution Explorer
O solution explorer a janela onde conseguimos visualizar todos os projetos componentes
de uma soluo criada no Visual Studio.NET. Para cada projeto, podemos ainda abrir os arquivos
componentes da soluo e adicionar arquivos novos.
Atravs do boto Show All Files ainda possvel visualizar todos os arquivos que
compem a pasta do projeto, independente de fazerem parte do projeto ou no.
Task List
Permite manipular as tarefas geradas pelo usurio e pelo Visual Studio .NET. As tarefas
podem ser adicionadas manualmente a janela de lista de tarefas ou podem ser adicionais atravs de
tokens de programao inseridos no cdigo.
Para inserirmos algum item falante na programao, podemos incluir por exemplo um
comentrio com a marca TODO, como o exemplo a seguir.
//TODO: Implementar o cdigo para validao do usurio
O comentrio acima geraria uma nova tarefa na lista de tarefas do Visual Studio.
Os tokens utilizados para a criao de tarefas atravs de comentrios podem ser configurados
atravs do menu Tools, opo Options, na rea Environment/Task List.
Object Browser
A janela object browser fornece informaes sobre os diferentes objetos do .NET Framework
e dos projetos, como suas propriedades, eventos e mtodos. Esta janela pode ser acessada atravs do
menu View, na opo Object Browser
Dynamic Help
O Visual Studio ainda disponibiliza o recurso de help dinmico, que pode ser acessado a
partir de qualquer janela da ferramenta. Para ativarmos o help dinmico, basta pressionarmos a tecla
F1 que a ferramenta disponibilizar um help contextualizado com a funo ativa no momento.
Properties
A janela de Properties disponibiliza as propriedades dos objetos quando estamos trabalhando
com componentes que fazem uso de uma rea de design. Para acessarmos esta janela, devemos estar
em modo de design. A janela pode ser acessada atravs da tecla F4.
Server Explorer
O Server explorer permite o acesso a recursos de servidores que podem ser utilizados durante
o desenvolvimento da aplicao. Atravs desta janela possvel iniciar e parar servios de um
servidor, ver os bancos de dados disponveis, a log de eventos e outros recursos adicionais.
Tambm possvel a criao de conexes com banco de dados para manipulao de objetos como
tabelas, procedures e views.
Class View
A janela Class View apresenta uma visualizao dos tipos definidos no seu projeto de forma
hierrquica (namespaces, classes, heranas, etc.). Um quadro de combinao (combo box) permite a
busca por tipos de modo rpido e simples. A parte inferior apresenta os membros do tipo
selecionado na parte superior, permitindo uma navegao simples at a definio do membro no
cdigo.
Refactoring
Alm das janelas j apresentadas aqui, o Visual Studio ainda possui uma srie de recursos que
facilitam a edio e manuteno do cdigo fonte dos programas. Este recurso tambm conhecido
por refactoring, e permite a troca de nome de mtodos ou de variveis e a replicao desta mudana
em todo o cdigo fonte, permite a extrao de interfaces de classes dentre outras funcionalidades.
Alinhamento de Janelas
O Visual Studio tambm apresenta um novo sistema para posicionamento das janelas
(Solution Explorer, Properties e etc.) dentro ad IDE. Agora, quando arrastamos uma janela para fora
da estrutura padro, fica muito simples arranjar o layout da maneira escolhida. Para isso, basta que
o desenvolvedor clique com o boto direito do mouse sobre a barra da Janela e selecione a opo
Docktable. Ao arrastar a janela pela IDE, algumas marcas inteligentes so mostradas, permitindo
que o desenvolvedor enquadre a janela onde quiser como visto abaixo.
Notem as marcas inteligentes - Elas permitem que a janela seja alinha a partir da janela
sobreposta; Ao clicar no centro a janela ser alinhada ao centro, enquanto os direcionais permitem
que seja alinha acima, abaixo, a esquerda ou a direita da janela sobreposta
ToolBox
A toolbox a janela que traz os controles para o uso no designer do Visual Studio. O Visual
Studio oferece uma srie de controles que facilitam o desenvolvimento tanto de aplicaes web
como aplicaes com formulrios.
Visual Basic.
Code Snippets
Outra funcionalidade interessante so os code snippets, que auxiliam a criao de cdigos
muito redundantes. Quem j no se cansou de ter que escrever vrias vezes o mesmo cdigo para
criar um DataSet? Como essa funcionalidade, basta clicarmos com o boto da direita em nosso
Code Editor e escolher a opo Insert Snippet. Ser exibida uma janela com os tipos de cdigos que
podem ser exibidos. Logo em seguida escolhemos por exemplo a opo Acessing Data e por fim
escolhemos a opo Fill a DataSet with the Result of a Parameterized Stored Procedures. O cdigo
resultante pode ser visto abaixo.
Uma janela aberta para que um tipo de cdigo seja escolhido pelo desenvolvedor.
O desenvolvedor poder escolher o tipo de cdigo que ser inserido no Code Editor.
Por fim, o cdigo gerado automaticamente para que o desenvolvedor apenas modifique as
informaes bsicas, como nome da Stored Procedure (no caso do exemplo), e informe os
parmetros para execuo.
IntelliSense
O intellisence fornece um quadro de listagem com opes sensveis ao contexto para
completar o cdigo. Alm disto, durante a navegao da lista, dicas so apresentadas com
descries de cada item
Regies de ocultao
Permitem a visualizao somente da parte do cdigo que est sendo manipulada num
determinando contexto.
Comentrios XML
Os comentrios em XML permitem a documentao do cdigo com um conjunto de
marcadores (tags) que podem ser utilizados dependendo do contexto. Estes comentrios de
documentao devem preceder imediatamente um tipo definido pelo usurio (como uma classe,
uma estrutura, uma interface ou um delegate) ou um membro (como um campo, uma propriedade,
um mtodo ou um evento). O IDE auxilia na documentao preenchendo automaticamente com
marcadores XML comuns de acordo com o contexto do cdigo abaixo do local de incluso dos
comentrios de documentao (///).
Breakpoints
Os breakpoint definem linhas de parada para execuo passo a passo em modo de depurao
para anlise de cdigo.
2.
Fundamentos da Linguagem C#
A linguagem C# exige que todo o programa esteja contido dentro de uma definio de um
tipo (ou seja, uma classe, interface, estrutura, enumerao, etc.). Diferente do Visual Basic e de
outras linguagens, no possvel criarmos funes ou variveis globais. Um programa simples
escrito em C# pode ser visto no exemplo a seguir.
No programa acima temos a definio da classe HelloClass que suporte um nico mtodo
com o nome de Main. Todo o executvel de um programa C# deve obrigatoriamente possuir um
funo Main, que funciona como ponto de entrada para o programa.
Voc pode perceber que a funo Main possui as palavras static e public na sua
declarao. Entraremos em detalhes sobre estes dois comandos mais a diante. Para este momento, o
importante entendermos que estes dois comandos indicam que esta funo visvel e pode ser
executada sem a necessidade de criao de um instancia de classe.
Como voc pode notar, o delimitador utilizado para a definio da classe C# so os caracteres
{ e }. Diferente de outras linguagens que utilizando comandos para delimitar blocos de cdigo
(como END no caso do cobol e End Function, End Sub no caso do VB) o C# utiliza para todo o
bloco de cdigo os caracteres de chaves.
Alm desta caracterstica, importante salientar que o C# uma linguagem que faz distino
entre letras maisculas e minsculas. Todas as palavras reservadas do C# so escritas em letras
minsculas, portanto, escrever Public ao invs de public pode gerar um erro de compilao do
programa.
Outro ponto interessante a ser observado o uso da classe Console. A classe console
apresenta uma srie de funes que so utilizadas para a interao com a interface de linha de
comando. Note que ao utilizar o mtodo WriteLine conseguimos imprimir uma informao
qualquer na tela do prompt de comando.
Da mesma forma, o comando ReadLine serve para obter alguma informao do usurio que
est interagindo com o programa. Neste caso estamos utilizando este comando apenas para que a
janela de prompt no seja fechada aps a execuo dos comandos.
Observe tambm que antes da definio de nossa classe HelloClass temos um comando using.
Este comando utilizado para indicar o uso de uma biblioteca dentro do nosso programa. A
biblioteca System a biblioteca que contm os tipos e classes mais primitivos do C#, dentre eles a
classe console que permite a interao com o prompt de comando.
Alm da classe console, ainda temos disponvel a classe environment. Esta classe nos permite
obter uma srie de informaes a respeito do ambiente de execuo de nossos programas. Da
mesma forma que a classe Console, a classe Environment faz parte da biblioteca System, por tanto
no necessrio utilizarmos a notao System.Environment.
Abaixo temos o exemplo de um outro programa que faz uso da classe Console e da Classe
environment.
using System;
namespace Modulo01
{
class Program
{
static void Main()
{
Console.WriteLine("Programa de testes do C#.");
Console.Write("Diretrio Atual: ");
Console.WriteLine(Environment.CurrentDirectory);
Console.Write("Nome da mquina: ");
Console.WriteLine(Environment.MachineName);
Console.Write("Verso do Sistema Operacional: ");
Console.WriteLine(Environment.OSVersion);
Console.Write("Usurio logado na mquina: ");
Console.WriteLine(Environment.UserName);
Console.ReadLine();
}
}
}
No programa acima fazemos o uso novamente da classe Console, utilizando os mtodos Write
e WriteLine. O mtodo Write exibe o contedo na tela sem uma quebra de linha, j o WriteLine
exibe o contedo na tela com uma quebra de linha.
Atravs da classe Environment podemos obter uma srie de informaes sobre o ambiente de
execuo de nosso programa, dentre elas o diretrio atual da aplicao, o nome da mquina do
usurio, a verso do sistema operacional e o usurio logado na mquina.
Declarando variveis
int numero;
string nome;
C#
Visual Basic.NET
System.Byte
byte
Byte
System.SByte
sbyte
SByte
System.Int16
short
Short
System.Int32
int
Integer
System.Int64
long
Long
System.UInt16
ushort
UShort
System.UInt32
uint
UInteger
System.UInt64
ulong
ULong
System.Single
single
Single
System.Double
double
Double
System.Object
object
Object
System.Char
char
Char
System.String
string
String
System.Decimal
decimal
Decimal
System.Boolean
bool
Boolean
Note que cada tipo do C# possui uma correspondncia a um tipo do Common Type System
(CTS), portanto utilizar o nome do CTS ou a palavra chave do C# a mesma coisa.
Int32 numero;
string nome;
o mesmo que
String nome;
Uma varivel pode ser inicializada na sua declarao, bastando para isto informar o sinal de
atribuio (=) logo aps o nome da varivel, juntamente com o valor a ser atribudo.
int contador = 0;
string nome = Fabrcio Scariot;
Alm disso, possvel atribuir valores as variveis em qualquer ponto do cdigo utilizando o
sinal de igualdade. No necessrio informar o tipo na frente do nome da varivel, pois isto
caracterizaria uma segunda declarao da mesma varivel. Um exemplo de atribuio de valores
pode ser observado a seguir.
using System;
namespace Modulo01
{
class Program
{
static void Main()
{
string usuario;
usuario = Environment.UserName;
string mensagem = "";
mensagem = "Bem vindo ao .NET " + usuario;
int valor;
valor = 10;
Int32 contador = 0;
}
}
}
As variveis podem ser declaradas dentro de mtodos (como a funo Main) e tambm dentro
da prpria classe (classe Program). No possvel declarar varivies FORA de um MTODO ou
CLASSE. No C# no existem variveis globais.
Utilizando operadores
Aps a declarao das variveis, possvel utilizarmos operadores para modificarmos o valor
destas varivies. Os operadores utilizam os smbolos aritimticos padro, como soma, subtrao e
diviso.
O exemplo a seguir mostra a utilizao de alguns operadores aritmticos.
using System;
namespace Modulo02
{
class Program
{
static void Main()
{
string usuario;
usuario = Environment.UserName;
Console.WriteLine(mensagem);
valor1 = 10;
valor2 = 20;
valor3 = valor1 + valor2;
valor3 += 5;
valor3 -= 8;
valor3 *= 9;
valor3++;
Console.ReadLine();
}
}
}
No que o operador de soma pode ser utilizado com tipos de dado strings, o que representa
uma operao de concatenao.
Os operadores disponveis para utilizao no .NET so:
Operador
Funo
Soma
Substrao
Multiplicao
Diviso
+=
-=
*=
/=
Environment):
Converso de dados
Quando precisamos atribuir o valor de uma varivel para outravarivel de um tipo diferente o
C# exige a utilizao de uma funo de converso. Diferente de outras linguagens, como o Visual
Basic, o C# exige a converso explicita de dados na maioria dos casos. Vamos analisar os diferentes
tipo de converso possveis no C#.
Converso Explicita
A converso explicita pode ser feita atravs da utilizao de operadores de cast (converso).
Um operador de cast utilizado informando-se o tipo de dados entre parnteses antes da atribuio
do valor a varivel de um tipo diferente. Um exemplo de operao de cast explicito pode ser
observada a seguir.
int valorInteiro;
double valorGrande = 10;
valorInteiro = (int)valorGrande;
No exemplo acima vemos para converter um valor do tipo double para o tipo inteiro, necessrio
informarmos um operador de converso antes da atribuio (int). Se no informarmos a funo de
converso, conforme o exemplo acima, receberemos um erro de compilao.
Converso Implicita
Apesar da exigncia de uma funo de converso na maioria dos casos, conforme vimos no
exemplo acima, existem alguns casos em que a funo de converso no se faz necessria. Quando
fazemos a converso de um tipo de dados de menor magnitude para um de maior magnitude, a
funo de converso no necessrio, tendo em vista que no corremos o risco de ter perda de
// Converso implcita
valorGrande = valorInteiro;
A converso de uma varivel qualquer para string o processo mais simples dentro de uma
aplicao .NET. Para convertermos um valor para o tipo string, basta informarmos a chamada do
mtodo ToString() aps o nome da varivel que o possui o valor a ser convertido. Todo e qualquer
tipo de dados do .NET possu a funo ToString e em alguns casos esta funo pode inclusive
receber parmetros. Um exemplo de converso pode para o tipo string pode ser observado a seguir.
using System;
namespace Modulo02
{
class Program
{
static void Main()
{
string mensagem;
No exemplo acima estamos somando duas variveis do tipo inteiro e concatenando o valor
convertido para string em uma varivel chamada mensagem.
A converso de strings para outros valores se d atravs do uso de uma classe especial para
converso, a classe Convert. A classe Convert capaz de converter uma string para qualquer tipo
primitivo de dados. A funo a ser utilizada deve ser To<Tipo de Dado>. Abaixo temos um
exemplo de uso da classe Convert.
int
valor = Convert.ToInt32(numero);
DateTime dt = Convert.ToDateTime("01/01/2007");
Outra opo para converso de strings a utilizao da funo Parse de um tipo especfico. A
maioria dos tipos de dados suporta a funo Parse, que permite a converso de um string para um
valor, conforme exemplo a seguir.
int
valor = Int32.Parse(numero);
DateTime dt = DateTime.Parse("01/01/2007");
Agora que voc tem uma viso geral da funo Main, da declarao de variveis e das
funes de converso, vamos trabalhar com a construo de objetos.
O termo objeto refere-se simplesmente a uma instancia de um classe em memria. Podemos
declarar variveis capazes de armazenar objetos da mesma forma que variveis de tipos primitimos,
bastanto para isto informar o tipo da classe e o nome da varivel. importante salientar que a
simples criao de uma varivel de um tipo de classe no representa um objeto no C#, portanto, o
exemplo a seguir representa um trecho de cdigo invlido.
class HelloClass
{
public void DisplayMessage()
{
Console.WriteLine("Hello da classe!");
}
class Program
{
static void Main()
{
HelloClass objeto;
}
}
Para criarmos um objeto, devemos utilizar o comando new. Este comando responsvel por
alocar os recursos necessrios para a utilizao desta classe (recursos como memria por exemplo).
A varivel funciona apenas como uma referncia para este local onde os recursos esto alocados.
HelloClass objeto2;
objeto2 = new HelloClass();
objeto1.DisplayMessage();
objeto2.DisplayMessage();
int a, b;
a = 10;
b = a;
b = 5;
// a continua com 10
// a operao acima no afeta a
// outra varivel, cada uma tem
// a sua cpia do valor;3
Quando estamos trabalhando com classes, as variveis no contem um valor, mas sim uma
referencia para uma rea de memria que contem o valor. Desta forma, se atribumos uma varivel
para outra varivel, estas passam a apontar para a mesma referencia, e as alteraes feitas em uma
varivel afetam os valores da outra varivel, conforme o exemplo.
Classe a, b;
a = new Classe();
a.valor = 10;
b = a;
b.valor = 500;
// A e B apontam para
// a mesma referencia
// a alterao feita a partir
// da varivel B, afeta a varivel a
O cdigo cima apresenta dois mtodos, um com retorno e outro sem retorno.
Os modificadores in/out/ref
Quando criamos parmetros em mtodos do C#, estes parmetros so passado por padro
como valores, ou seja, se estes valores forem alterados durante a execuo do mtodo, a mudana
destes valores no ser refletida na varivel passada por parmetro. Este comportamento atribudo
ao modificador de parmetro in, que implcito e no precisa ser informado. O exemplo abaixo
mostra a passagem de parmetros por valor.
public void AlteraValores(int valor)
{
valor += 10;
}
{
int valor = 100;
AlteraValores(valor);
O modificador ref
O parmetro ref permite a passagem de valores por referencia. Utilizando a passagem de
valores por referencia, os valores modificados dentro da funo refletem suas alteraes para a
funo chamadora. Para utilizarmos o operador ref, devemos inform-lo tanto na declarao do
parmetro como tambm na chamada do mtodo.
public void AlteraValores(ref int valor)
{
valor += 10;
}
O modificador out
A diferena entre o modificador out e o ref que o out permite a passagem de uma varivel
no inicializada por parmetro, o que no permitido em parmetros ref. Veja o exemplo a seguir.
AlteraValores(out valor);
Quando utilizamos o modificador out, a varivel deve obrigatoriamente ser inicializada dentro
da funo que contem o parmetro out.
Criando Propriedades
As propriedades refletem o estado de uma classe dentro. Nas propriedades devemos colocar
valores que representem informaes armazenas pelas classes. As propriedades no so
simplesmente variveis com visibilidade pblica, mas sim estruturas de dados capazes de abstrair a
complexidade de uma certa informao armazenada pela classe. Podemos por exemplo criar uma
classe Tempo que exponha uma propriedade Horas e uma propriedade Minutos, mas internamente
armazene os valores apenas em minutos.
Uma propriedade possui sempre dois mtodos de acesso, um para gravao de valores e outro
para leitura.
No exemplo a seguir podemos observar uma propriedade que armazena as informaes sobre
o trabalho de um funcionrio.
class Trabalho
{
private int m_Horas;
parmetros.
No corpo da propriedade podemos observar os mtodos de acesso get e set. O mtodo get
representa a ao de obteno do valor da propriedade, j o mtodo set representa uma atribuio de
um valor a propriedade. O mtodo set utiliza a palavra reservada value para atribuir um novo valor
a propriedade.
As propriedades armazenam internamente seus valores em variveis privadas. Desta forma,
podemos abstrair do usurio a complexidade de armazenamento das horas trabalhadas. Caso
quisssemos armazenas as horas trabalhadas em minutos, poderamos simplesmente alterar os
mtodos de acesso da propriedade, sem prejudicar os usurios da propriedade da classe, conforme
exemplo a seguir.
class Trabalho
{
private int m_Minutos;
Utilizando Construtores
As classes podem apresentar mtodos especiais chamados de construtores. Os construtores
so mtodos especiais capazes de inicializar a classe com algum valor. O mtodo construtor pode
ser identificado por um mtodo com o mesmo nome da classe. O exemplo a seguir mostra o
exemplo de um construtor.
class Trabalho
{
private int m_Minutos;
public Trabalho()
{
// CONSTRUTOR
// Inicializa minutos com zero
m_Minutos = 0;
}
}
}
O construtor chamado sempre que instanciamos uma classe utilizando o comando new,
conforme o exemplo a seguir.
Trabalho trab;
trab = new Trabalho(); //Construtor chamado aqui
Definindo Constantes
Outra estrutura importante que pode ser construida no C# so as constantes. As constantes so
valores que no alteram o seu valor durante a execuo do programa. Em geral so utilizados para
parmetros de configurao ou para valores fixo representados por um nome para maior clareza.
As constantes so declaradas atravs da palavra const, e assim como qualquer outra estrutura
de programao deve ser declarada dentro de uma classe.
Construindo Enumeradores
Os enumeradores so estruturas de dados que facilitam a leitura do cdigo, permitindo definir
constantes nomeadas para um conjunto de valores. Para definirmos um enum, utilizamos a seguinte
sintaxe.
enum TipoConta
{
Corrente,
Poupanca,
Investimento
}
No exemplo acima, temos um enumerador que permite o uso de trs valores, Corrente,
Poupana e Investimento. Os enumeradores so tipos de dados assim como as classes, o que nos
permite a declarao de variveis com o tipo do enum. Para atribuirmos valores a estas variveis,
utilizados o nome do enum, um ponto e o nome do valor nomeado dentro do enum, conforme o
exemplo a seguir.
TipoConta tipo;
tipo = TipoConta.Corrente;
Os valores de um enum podem ser convertidos para strings ou para inteiros. Caso sejam
convertidos para inteiros os valores so correspondente a posio de declarao do valor nomeado
no enum, comeando por zero, conforme o exemplo a seguir.
TipoConta tipo;
tipo = TipoConta.Corrente;
possvel atribuir valores inteiros a cada item do enum, bastanto para isto informar o sinal de
igual e o valor desejado na declarao do enum. Utilizando esta notao, o valor informado ser
utilizado quando ocorrer uma converso do valor do enum para inteiro.
invs de um string
3. Crie um novo enumerador chamado TipoConta. Informe os tipos de conta Poupanca,
Corrente e Investimento.
4. Altere a funo Main para que seja solicitado o tipo de conta e o tipo de pessoa
5. Execute o programa e teste novamente
// Apenas um inteiro
int valor;
// Um array de inteiros
int[] valores;
possvel ainda inicializar o array no seu dimensionamento, bastanto para isto informar os
itens do array logo aps o comando new entre chaves, conforme o exemplo a seguir.
// Array com 5 inteiros
int[] valores = new int[5] { 1, 2, 3, 4, 5 };
se informar entre colchetes o ndice do array a ser acessado. Os array sempre iniciam pelo ndice 0,
conforme o exemplo a seguir.
nomes[0] = "Nome1";
nomes[1] = "Nome2";
Redimensionando Arrays
O C# no possui um comando de redimensionamento de array, como o Visual Basic
(comando Redim). Para redimensionarmos um array no C# devemos utilizar uma funo da classe
System.Array, a funo Resize. Esta funo possibilita o redimensionamento do array semelhante a
funo Redim do Visual Basic.
string[] nomes = new string[2];
nomes[0] = "Nome1";
nomes[1] = "Nome2";
System.Array.Resize<string>(ref nomes, 3);
nomes[2] = "Nome3";
Classes de colees
Apesar de suportar array, as operaes com este tipo de estrutura em geral so complexas de
se implementar. O mais comum utilizarmos as classes de coleo. Estas classes abstraem a
complexidade dos array, tornando o redimensionamento e a obteno de itens automtica. As
classes de coleo fazem parte da biblioteca (namespace) System.Collections. A seguir temos um
exemplo da utilizao da classe ArrayList.
System.Collections.ArrayList lista
= new System.Collections.ArrayList();
lista.Add("Nome1");
lista.Add("Nome2");
lista.Add("Nome3");
lista.Remove("Nome2");
lista.RemoveAt(0);
Como voc pode observar a instruo de deciso deve ser colocada entre parnteses logo aps
o comando IF e no devemos informar a clusula THEN. O bloco que delimita o comando IF o
padro do c#, ou seja, as chaves. O comando ELSE opcional e deve vir logo aps o bloco de
cdigo contendo o cdigo a ser executado caso a instruo seja verdadeira.
Dentro de um IF, podemos informar critrios compostos utilizando os operador E e OU. Ao
contrrio do Visual Basic, no utilizamos as palavras em ingls para representar estes operadores
mas sim os smbolos && para E e || (duplo pipe) para OU. O exemplo a seguir mostra uma lgica
composta com estes operadores.
No exemplo acima podemos observar dois operadores no C#. Podemos observar o operador
lgico && atuando como comando AND para os dois critrios. Tambm podemos observar o
operador == representa o operador lgico de igualdade no C#. A seguir podemos observar a lista de
operadores lgicos disponveis.
Operador
Funo
==
Testa igualdade
!=
Testa no igualdade
>
Maior que
<
Menor que
>=
Maior ou igual
<=
Menor ou igual
Operador de negao
&&
Operador E
||
Operador OU
Muitas vezes precisamos testar uma determinada varivel para um conjunto finito de valores,
ou mesmo executar uma determinada instruo dependendo do valor contido em uma varivel. O
C# oferece o comando switch para estes casos, que funciona da mesma forma que o comando Select
Case do Visual Basic. A sintaxe do comando switch pode ser observada a seguir.
switch (dia_semana)
{
case 1:
nome_dia = "domingo";
break;
case 2:
nome_dia = "segunda-feira";
break;
case 3:
nome_dia = "tera-feira";
break;
case 4:
nome_dia = "quarta-feira";
break;
case 5:
nome_dia = "quinta-feira";
break;
case 6:
nome_dia = "sexta-feira";
break;
case 7:
nome_dia = "sbado-feira";
break;
default:
nome_dia = "dia invlido";
break;
}
5. Utilizando a clusula IF, faa o teste para verificar se o CPMF deve ser descontado ou no
do cliente
6. Crie uma nova classe dentro do mesmo arquivo com o nome de OperacaoContabil
7. Crie trs variveis membro na classe, com as seguintes informaes
a. DataLancamento
b. Valor
c. Historico
8. Implemente um construtor na classe OperacaoContabil para atribuir os valores as
variveis criadas
9. Ao invs de inserir um texto no ArrayList, crie uma nova instancia da classe
OperacaoContabil, com a data de hoje, o valor da operao e um histrico indicando
saque ou depsito. Insira a instancia da classe OperacaoContabil no ArrayList
O comando For
O comando de repetio mais simples o comando for e possui a seguinte sintaxe:
for(varirivel=valorinicial;expresso booleana;expresso de incremento)
No exemplo a seguir vemos a utilizao do comando for para executar um bloco de cdigo
um nmero determinado de vezes.
Note que a varivel utilizada no for declarada dentro do prprio comando. Utilizando o
comando desta forma, a varivel tem visibilidade somente dentro do for.
O comando while
O comando while pode ser utilizado de duas formas, sem o comando do e com o comando
do.
Na primeira opo, informamos a clusula while e a condio que ser avaliada para verificar
se o bloco de cdigo contido no loop deve ser executado ou no. Caso a expresso retorne valor
int i=0;
while (i < 10)
{
Console.WriteLine("Linha " + i.ToString());
}
A outra opo utilizarmos o comando do. Neste caso, a iterao executada pelo menos
uma vez e a expresso booleana avaliada ao final do bloco de cdigo.
int i = 0;
do
{
Console.WriteLine("Linha " + i.ToString());
} while (i < 10);
O comando foreach
O comando foreach utilizado nos casos em que queremos fazer uma iterao em uma lista
de valores ou um array. Para cada elemento na coleo especificada, o comando executar o bloco
de cdigo especificado, conforme exemplo a seguir.
string[] arquivos = System.IO.Directory.GetFiles("C:\\WINDOWS");
Ainda temos a opo de interromper uma iterao especfica do loop, passando para a
prxima iterao.
{
if (arquivo.EndsWith(".dll"))
continue;
namespace BERGS.BRB
{
public class Servico
{
//...
}
{
//...
}
}
Quando uma classe faz parte de um namespace, o nome desta classe composto pelo
namespace o qual ela est contida mais o nome da classe (separado por pontos). Se temos uma
classe chamada ContaCorrente, dentro de um namespace BERGS.BCC, o nome real desta classe
BERGS.BCC.ContaCorrente (este nome completo tambm chamado de nome totalmente
qualificado).
Quando queremos referenciar uma classe podemos utilizar tanto o seu nome totalmente
qualificado (com namespace) ou simplesmente o nome da classe. Para utilizarmos somente o nome
da classe, devemos informar no topo do arquivo de cdigo uma clusula using indicando o uso do
namespace que contm a classe. importante salientar que o uso da clusula using NO
OBRIGATRIO, ele apenas facilita a codificao pois permite a utilizao do nome da classe ao
invs dos nomes totalmente qualificados.
Veja o exemplo a seguir.
namespace BERGS.
{
public class Teste
{
public void subrotina()
{
BERGS.BRB.Servico obj = new BERGS.BRB.Servico();
}
}
}
Neste exemplo temos o uso do objeto utilizando o nome totalmente qualificado. No prximo
exemplo, temos o uso do objeto utilizando apenas o nome da classe e a clusula using.
using BERGS.BRB;
namespace BERGS.
{
public class Teste
{
public void subrotina()
{
Servico obj = new Servico();
}
}
Se precisssemos chamar o mtodo acima, no seria necessrio criar uma instancia da classe
log, bastaria informarmos o nome da classe e a funo.
// ou
using BERGS.BTR;
...
Utilizando Strings do C#
O tipo string apesar de se comportar como um value type na verdade um reference type.
Apesar disso, devemos considerar que estamos trabalhando com um value type quando estamos
manipulando strings, tendo em vista que este tipo de dado foi programado para funcionar como tal.
A classe string possui uma srie de mtodos estticos e no estticos, que so utilizamos para
formatao, concatenao, desmembramento, substring, etc.
Vamos analisar alguns destes mtodos da classe string.
O mtodo Substring
O mtodo substring um mtodo no esttico que permite pegarmos uma poro de uma
string. Para utilizarmos o mtodo substring, basta chamar o mtodo a partir de uma varivel string
ou mesmo de uma string literal, conforme o exemplo.
string nome = "Testando da Silva";
O mtodo substring aceita como parmetro a posio inicial que queremos obter e quantos
caracteres devem ser extrados. Caso no seja informado o nmero de caracteres a ser extrado, a
funo retornar o restante da string a partir da posio inicial informada.
O mtodo IndexOf
O mtodo IndexOf utilizado para localizar uma determinada palavra dentro da string. Este
mtodo retornar a posio da string desejada. Caso a string no seja encontrada, ser retornado o
valor -1.
Conforme vimos no exemplo, possvel informar a posio inicial para busca como um
parmetro adicional.
nome = nome.ToUpper();
nome = nome.ToLower();
if(nome.StartsWith("brb"))
Console.WriteLine(" do sistema BRB!");
if(nome.EndsWith(".dll"))
Console.WriteLine(" uma dll!");
SCARIOT
";
nome = nome.TrimEnd();
nome = nome.TrimStart();
nome = nome.Trim();
A Funo String.Format
A funo String.Format uma das funes mais versteis da classe string. Esta funo
permite a criao de uma string baseada em um padro. Podemos colocar dentro do padro da string
de formatao alguns tokens que poderam ser substitudos por variveis passadas por parmetro no
comando format.
No exemplo acima, o padro da string (primeiro parmetro) contm um token {0}. Este token
indica que este valor deve ser substituido pelo segundo parmetro passado para a funo (neste caso
a palavra parmetro.
No exemplo acima, temos o padro da string com mais de um token, com nmeros de 0 2. A
funo tambm recebe 3 parmetros adicionais que correspondem aos valores que sero
substitudos na string.
Alm de informarmos os tokens, podemos informar regras de formatao que sero utilizadas
de acordo com o tipo de dado passado por parmetro, conforme o exemplo,
A classe StringBuilder
Apesar da versatilidade da classe string, operaes com string podem consumir muitos
recursos e causar perda de desempenho. Isto ocorre porque a cada operao o framework cria um
novo buffer para a string resultante da operao, ao invs de aproveitar o buffer que est sendo
utilizado. Isto mais aparente em operaes de concatenao.
Para no criar este tipo de problema, podemos utilizar a classe StringBuilder, do namespace
System.Text. Esta classe permite a criao de strings aproveitando o buffer utilizado, o que torna o
cdigo mais eficiente.
No exemplo a seguir temos um trecho de cdigo com uma operao feita de forma ineficiente
e outra mais eficiente usando o stringBuilder, veja a diferena.
// Codigo ineficiente
string sql;
sql = "SELECT * FROM Products";
sql += " WHERE CategoryId=1 AND";
sql += "
AND UnitPrice>10";
// Codigo Eficiente
StringBuilder sb =
new StringBuilder();
AND UnitPrice>10");
sql = sb.ToString();
1. Implemente uma funo chamada ImprimirSaldo que retorne um string com a seguinte
informao.
Seu saldo atual de R$ XXXX,XX
Utilize a funo String.Format para obter esta string.
2. Altere o menu de opes da tela inicial da aplicao para disponibilizar mais uma funo,
a funo Saldo que far a chamada a funo ImprimirSaldo da classe
3. Altere a funo Extrato para construir um extrato em string utilizando a classe
StringBuilder, ao invs de utilizar a funo Console.WriteLine. Utilize as funes PadLeft
e PadRight para que o extrato seja exibido com os valores alinhados.
4. Na propriedade CPF da classe conta, altere o cdigo para que no mtodo de acesso get o
CPF seja retornado com 11 dgitos, completando com zeros a esquerda
5. Utilizando a funo Split, altere a propriedade NomeCorrentista para que ela armazene o
nome e sobrenome em variveis separadas.
3.
Introduo
Muitas vezes em nossas aplicaes precisamos trabalhar com arquivos texto ou mesmo
arquivos de outros tipos (binrios, csvs, etc.). Neste capitulo veremos como programar a
leitura e a gravao de arquivos no C# e tambm como fazemos para criar pastas e realizar
operaes as operaes de copia, excluso e troca de pastas no sistema de arquivos.
O Namespace System.IO
No namespace System.IO podemos encontrar todas as classes responsveis pela manipulao
de arquivos e pastas. Boa parte das classes que encontramos neste namespace possui mtodos
estticos, o que nos possibilita chamar estes mtodos sem criarmos uma instancia da classe em
questo. Para que possamos trabalhar com o namespace System.IO, devemos utilizar a clusula
using para facilitar nosso trabalho.
Note que ao finalizarmos a gravao das informaes no arquivo, utilizamos o mtodo Close
para fechar o Stream. importante fecharmos o arquivo sempre que terminamos de realizar
qualquer operao com arquivos, do contrrio o arquivo ficar aberto.
No exemplo abaixo, iremos criar uma instancia da classe StreamReader para ler o arquivo que
acabamos de criar. Utilizaremos o mtodo ReadLine para ler as informaes do arquivo.
StreamReader oFileRead = new StreamReader("C:\teste.txt");
string sLinha;
while(oFileRead.Peek() > -1)
{
sLinha = oFileRead.ReadLine();
Console.WriteLine(sLinha);
}
oFileRead.Close();
Notem que utilizamos o mtodo Peek da classe StreamReader. Este mtodo nos informa o
nmero de caracteres restantes existentes no arquivo. Caso no existam mais caracteres a serem
lidos, o mtodo Peek retorna o valor de -1.
oFileExclusive.Close();
4.
Orientao objetos no C#
Encapsulamento
O encapsulamento implementado na linguagem C# atravs da implementao de mtodos e
propriedades das classes. As classes podem encapsular uma srie de tarefas complexas, expondo ao
usurio funes mais simples, que permitem uma codificao mais fcil.
Abstrao
Outro conceito importante o conceito de abstrao. A abstrao utilizada para expor ao
usurio apenas o que realmente importante, escondendo dele os detalhes de implementao ou
mesmo alguma complexidade gerada pela classe.
}
}
Na classe acima temos uma funo pblica chamada CalculaValorParcelas que recebe alguns
parmetros e devolve ao usurio um array de valores double contendo o valor das parcelas. Temos
uma funo adicional chamada CalculaTaxaJuros que pelo fato de ser uma funo usada
internamente pela classe para obter a taxa de juros baseada no tipo de cliente no exposta ao
usurio da classe.
Se um usurio tentasse utilizar a classe, s poderia ver a funo CalculaValorParcela, pois a
nica com modificador de acesso public. Conforme exemplo abaixo.
Herana
A herana um conceito extremamente utilizando dentro do .NET Framework. Este conceito
utilizado quando precisamos que uma determinada classe tenha todas as caractersticas de uma
classe com algumas modificaes em seu comportamento, ou mesmo algumas funcionalidades
adicionais.
class ContaCorrente
{
private double m_Saldo;
private string m_NomeCorrentista;
private int m_CodAgencia;
private int m_CodConta;
}
public int Agencia
{
}
}
public void Depositar(double valor)
{
}
}
A classe acima mostra a implementao de uma conta corrente, que permite o saque e o
depsito de valores e contm algumas funcionalidades. Imagine que o sistema necessita suportar
um novo tipo de conta. Este novo tipo de conta permitir ao cliente ter um limite de crdito para
saques. Alm do limite de crdito, a conta dever ter o valor da taxa de juros cobrada do cliente em
caso de utilizao do limite de crdito dentre outras funcionalidades. Este novo tipo de conta ter
exatamente as mesmas caractersticas de uma conta corrente, mas dever suportar estas novas
funcionalidades.
Ao invs de implementarmos uma nova classe, com uma cpia de todas as funcionalidades
existentes na classe ContaCorrente, podemos criar uma nova classe e fazer com que ela herde as
caracteristicas da ContaCorrente. Desta forma, esta conta especial ter as mesmas funcionalidades
da conta corrente, e algumas funcionalidades adicionais implementadas especificamente para esta
classe. A vantagem de utilizarmos este tipo de implementao que caso tenhamos que alterar
alguma funcionalidade bsica da conta corrente, estas alteraes se propagaram automaticamente
para a classe da conta especial.
Para implementarmos o mecanismo de herana no C#, basta informarmos o smbolo : aps
a declarao da classe e o nome da classe a qual queremos herdar as caractersticas. No exemplo a
seguir temos a criao da classe ContaEspecial.
Se tentarmos instanciar a classe ContaEspecial, poderemos observar que ela possui todos os
class ContaCorrente
{
private double m_Saldo;
// ...
}
// ...
}
Implementando polimorfismo
Polimorfismo o princpio pelo qual duas ou mais classes derivadas de uma mesma
superclasse podem invocar mtodos que tm a mesma identificao (assinatura) mas
comportamentos distintos, especializados para cada classe derivada, usando para tanto uma
referncia a um objeto do tipo da superclasse.
Antes de verificarmos como o polimorfismo funciona sob o ponto de vista do usurio da
classe, vamos ver como podemos implementar comportamentos diferentes para um mesmo mtodos
na classe pai e na classe filha.
O modificador virtual
No exemplo que utilizamos at aqui, temos a classe ContaCorrente e a classe ContaEspecial.
Quando o usurio tenta efetuar um saque de algum valor e chama o mtodo Sacar da classe conta
especial, internamente ele estar chamando o mtodo sacar da classe contacorrente, pois onde o
mtodo est definido. Porm, nesta situao, o mtodo sacar deveria ter um comportamento
diferente, pois deveria considerar o limite de crdito do usurio e no apenas o saldo em conta
corrente. Para permitirmos que as classes filhas possam alterar o comporamento de funes da
classe pai, reimplementando mtodos, podemos utilizar o moficador virtual, conforme o exemplo a
seguir.
class ContaCorrente
{
protected double m_Saldo;
m_Saldo -= valor;
return valor;
}
}
Declarando o mtodo com este modificador, permitimos que ele seja reimplementado em
classes que herdem suas caractersticas.
O modificador override
Agora vamos ver como podemos reimplementar o mtodo Sacar na classe ContaEspecial.
Para reimplementarmos o mtodo, basta declararmos um novo mtodo com a mesma assinatura do
mtodo da classe pai e com o modificador override, conforme o exemplo a seguir.
class ContaEspecial : ContaCorrente
{
public double m_LimiteCredito;
m_Saldo -= valor;
return valor;
}
}
}
}
ctaA.Sacar(1000);
ctaC.Sacar(1000);
Note que estamos atribuindo uma instancia da classe ContaEspecial para uma varivel do tipo
ContaCorrente. Mesmo estando armazenada em uma varivel deste tipo, a instancia continua sendo
uma instancia de conta especial.
O poliformismo acontece justamente na chamada do mtodo Sacar. Mesmo estando
armazenada em uma varivel ContaCorrente, a instancia da classe ContaEspecial continua se
comportantando normalmente, ou seja, nas chamados do mtodo Sacar a implementao definida na
classe ContaEspecial continuar a ser chamada.
Caso tenhamso que fazer a converso no caminho inverso, ou seja, da classe ContaCorrente
para a classe ContaEspecial, temos que utilizar uma converso explicita. Isto porque a varivel
conta corrente pode no conter uma instancia da varivel ContaEspecial, e por isso precisamos
informar ao compilador que sabemos que a converso pode ser efetuada, conforme exemplo a
seguir.
ContaEspecial ctaA = new ContaEspecial();
ContaCorrente ctaB = cta;
ContaCorrente ctaC = new ContaEspecial();
ContaEspecial ctaD = (ContaEspecial)ctaB;
A classe System.Object
Um aspecto importante sobre as classes criadas no .NET Framework que mesmo a classe
no tendo uma herana explicita, esta classe herdar implicitamente as caractersticas da classe
Syste.Object. A classe Object a classe mais bsica do .NET Framework e por este motivo, todo e
qualquer objeto pode ser convertido para a classe object. A classe object muito semelhante ao tipo
Variant do Visual Basic. No exemplo a seguir temos uma srie de instancias de classe sendo
convertidas para o tipo object.
Cliente cli = new Cliente();
CustomerBO cust = new CustomerBO.Trabalho();
cust = (CustomerBO.Trabalho)cust;
Note que os tipos tambm podem ser convertidos de object para outras classes, bastando para
isto implementar um operador de converso.
Podemos tambm converter variveis value types para o tipo object. Como as variveis value
types no possuem uma referencia aos valores, e sim o prprio valor, quando atribuimos um
varivel value type para uma varivel do tipo object estamos fazendo uma operao chamada
boxing, ou seja, estamos colocando um valor value type dentro de um reference type. O mesmo
acontece no processo inverso, quando colocamos uma varivel object para um value type, estamos
utilizado o processo de unboxing. O exemplo a seguir mostra como funcionam estas duas
operaes.
// boxing do numero 10
// em um object
object obj = 10;
// unboxing da referencia
// object para o valor inteiro
int valor = (int) obj;
mtodo ToString, mesmo que no classe no haja qualquer indicao de um processo de herana.
return texto;
}
}
Classes parciais
Outro recurso interessante disponvel no C# a possibilidade de implementarmos uma classe
em diversos arquivos. Isto possvel utilizando o modificador partial na declarao da classe. Todas
as partes da classe devem conter este modificador. O compilador, no momento da compilao, junta
Arquivo2.cs
partial class ContaPoupanca
{
DateTime m_DataAniversario;
Documentao XML
Outro recurso disponvel no C# a documentao XML. Atravs desta documentao
possvel especificarmos detalhes sobre um determinado mtodo, classe ou propriedade.
A documentao XML criada a partir de tags XML que so inseridas em blocos de
comentrios antes da declarao do mtodo, propriedade ou classe. Para criarmos estes blocos de
comentrio, basta inserirmos um comentrio com trs barras (///) e utilizarmos as tags conforme
necessrio.
Implementando a documentao via XML, o usurio que utilizar sua classe poder obter
informaes sobre os mtodos atravs do intellisense. A seguir vemos um exemplo de
implementao de documentao via XML.
/// <summary>
/// Aplica o reajuste no saldo da poupana de
5.
Interfaces e colees
Definindo interfaces no C#
No exemplo acima temos uma classe chamada Impressora que faz interface com uma
impressora capaz de imprimir documentos de qualquer espcie. Seu sistema trabalhar com uma
srie de documentos. A classe Impressora tem um mtodo chamado imprimir, que deve receber
como parmetro um documento para ser impresso. A grande dvida , que tipo devemos utilizar
para este parmetro?
Caso quisssemos imprimir recibos, poderamos fazer com que a classe impressora recebesse
uma instancia da classe pai Recibo. O problema que isto no permitiria a impresso de
documentos da classe ExtratoBancario ou mesmo da classe FichaCadastral.
Outra opo seria criar diversos overloads do mtodo imprimir, permitindo a chamada com
diversos tipos de parmetro. O problema deste tipo de abordagem que a cada documento novo que
surgisse, seria necessrio implementar alteraes na classe Impressora, para criar um novo overload
e um novo documento.
As interfaces servem para resolver justamente situaes como esta. As interfaces funcionam
como uma espcie de protocolo, que permite objetos distintos (e que muitas vezes herdam de
classes diferentes) possam ser utilizados como parmetro ou mesmo como tipo de retorno para
outros objetos.
No exemplo acima, poderamos implementar uma interface com o nome IPrintable, que
obrigaria cada uma das classes que implementa tal interface a disponibilizao de um mtodo
Implementanto interfaces no C#
A criao de interfaces no C# semelhante a criao classes, com a diferena que utilizamos
a palavra reservada interface ao invs da palavra class, conforme o exemplo a seguir.
public interface IPrintable
{
void ObterDocumento();
int NumeroPaginas();
}
No que a declarao dos mtodos nas interfaces no possuem moficador de acesso (public,
private, protected). Isto ocorre pois todos os membros declarados na interface devem ser
obrigatriamente pblicos.
Outro detalhe importante que deve ser observado que os mtodos no possuem
implementao nas interfaces. Conforme j comentamos, a interface funciona apenas como um
protocolo, ou seja, no existe qualquer implementao dentro da interface.
Para fazermos com que uma classe implemente uma interface, devemos utilizar a mesma
notao da herana de classes, ou seja, colocar aps a declarao da classe o smbolo : e o nome
da interface. Caso a classe j herde as caracteristicas de uma outra classe ou mesmo de outra
interface, podemos informar uma interface adicional separando cada uma delas por vrgula.
}
}
Apesar de o mtodo imprimir poder receber objetos dos mais variados tipos como parmetro
atravs da classe IPrintable, note que as nicas funes disponveis para chamada so as funes
implementadas na interface.
importante definirmos uma interface com todos os mtodos necessrios para
implementarmos a funcionalidade desejada.
interfaces, ao invs de classes. Como exemplo podemos pegar a classe ArrayList, que j utilizamos
em captulos anteriores. Podemos verificar que o mtodo AddRange recebe como parmetro
qualquer objeto que implemente uma interface ICollection, o que abrange arrays de qualquer
natureza, HashTables, SortedLists, etc.
A interface IEnumerable
A interface IEnumerable uma interface padro do .NET framework que permite a
implementao de enumeradoes. Sempre que queremos permitir que o objeto possa ser utilizado em
um comando foreach, devemos implementar a interface IEnumerable. Veja o exemplo a seguir.
A interface IClonable
A interface IClonable obriga o objeto a implementar o mtodo Clone que deve criar uma
cpia exata do objeto. Este tipo de interface til para casos em que queremos garantir que o objeto
possa ser duplicado durante a execuo do programa. Veja o exemplo a seguir.
}
}
A interface IComparable
A interface IComparable utilizada para permitir que objetos de uma classe possam ser
comparados com objetos de outra classe. A interface IComparable til em situaes em que temos
que implementar ordenao em colees de itens de nossa classe. Veja o exemplo.
6.
Nos captulos anteriores verificamos alguns conceitos sobre a orientao a objetos e como
podemos implementar estes conceitos no C#. Vimos tambm a diferena entre variveis do tipo
Reference Type e vrias do tipo Value Type.
As variveis reference type geralmente se referem a instancias de classes. Conforme vimos, as
classes so apenas especificaes de uma determinada entidade do sistema que determinam o seu
comportamento. Para criarmos uma instancia de uma classe (um objeto) devemos criar uma varivel
do tipo desta classe e utilizar o comando new para alocar uma nova instancia da classe. Podemos
alocar quantas instancias quantas forem necessrias, e para cada uma delas ser alocado um espao
de memria para seus dados e seu funcionamento, conforme o exemplo a seguir.
O Garbage Collector
O processo responsvel por eliminar referencias de objetos no utilizadas o garbage
collector. Como o prprio nome diz, este recurso responsvel por desalocar qualquer recurso que
no esteja sendo utilizado pelo programa.
O garbage colector um processo no determinstico, ou seja, no possvel determinarmos
quando o garbage collector ir executar para captar objetos no utilizados. Em geral o framework
realiza este processo quando necessita alocar memria para novos objetos. Antes de alocar uma
quantidade grande de memria, o garbage collector executado para eliminar objetos no
utilizados.
possvel interagir com o garbage collector atravs da classe System.GC. Esta classe permite
inclusive a chamada de um mtodo para forar a execuo do garbage collector.
System.GC.Collect();
Finalizao de objetos
Quando o garbage collector faz o processo de desalocao dos objetos, podemos fazer com
que uma funo seja executada antes que o objeto seja eliminado. Estas funes so chamas funes
destrutoras. Em geral utilizamos estas funes para destruirmos instancias de objetos no
gerenciveis, tendo em vista que o framework no tem controle sobre este tipo de objeto.
A implementao de um destrutor semelhante a sintaxe utilizada para construirmos um
construtor, com a diferena que devemos utilizar o smbolo ~ na frente da declarao, conforme o
exemplo a seguir.
public Funcionario()
{
objetoNaoGerenciavel = new
S01VWClass();
}
~Funcionario()
{
objetoNaoGerenciavel.Deslogar();
}
}
No exemplo acima temos uma classe que faz uso de um objeto COM (componente VB6). Este
objeto aloca uma srie de recursos no gerenciveis que so utilizados durante a execuo de
mtodos da classe. Para garantirmos que os recursos deste objeto COM sejam liberados devemos
implementar um destrutor para a classe, de forma a liberar qualquer recurso alocado pela classe
COM. Neste caso, chamamos um mtodo deslogar para liberar estes recursos.
Disposable Classes
O nico inconveniente da implementao utilizada acima que o recurso do objeto COM s
ser liberado no momento em que o Garbage Collector for executado. Isto porque o mtodo
public Funcionario()
{
objetoNaoGerenciavel = new
S01VWClass();
}
~Funcionario()
{
if(objetoNaoGerenciavel != null)
objetoNaoGerenciavel.Deslogar();
}
Note que implementamos o mtodo Dispose de forma que ele possa ser executado mais de
uma fez. Fazemos isto definindo a varivel do objeto no gerencivel para null e testando nas
prximas execues. importante salientar que NO NECESSRIO definir a varivel para null
para desalocar um objeto, este artifcio foi utilizado apenas por uma questo de lgica.
7.
Nos captulos anteriores verificamos alguns conceitos sobre a orientao a objetos e como
podemos implementar estes conceitos no C#. Vimos tambm a diferena entre variveis do tipo
Reference Type e vrias do tipo Value Type.
Neste captulo vamos ver como funciona a estrutura de tratamento de erros no C#. O
tratamento de erros no C# funciona de uma forma um pouco diferente em relao ao Visual Basic
6.0. No Visual Basic utilizamos o comando On Error com um apontador Goto para uma regio onde
o erro deveria ser tratado. No C# trabalhamos com o conceito de tratamento estruturado de
excees, onde devemos envolver o cdigo onde existe a possibilidade de ocorrer uma exceo,
alm de informar os tipo de exceo que devem ser tratadas.
O tratamento de excees fundamental em qualquer aplicao, tendo em vista que qualquer
aplicao est sujeita a erros, sejam estes de programao ou de alguma falha de ambiente.
try
{
StreamReader sr = new StreamReader("C:\\TESTE.TXT");
System-Level Exceptions
No exemplo que utilizamos anteriormente voc deve ter percebido que o cdigo com
tratamento de erro foi envolvido em um bloco pelo comando try. Aps o bloco do comando try,
podemos observar um comando catch. No comando catch devemos informar o tipo de exceo que
queremos tratar. Caso esta exceo ocorra, ser tratada pelo bloco de cdigo indicado.
try
{
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
No exemplo acima, estamos tratando uma exceo do tipo Exception. A exceo do tipo
exception a exceo mais genrica possvel disponvel no C#. Com esta exceo podemos tratar
qualquer tipo de erro ocorrido dentro do sistema. A desvantagem deste tipo de exceo que por ser
genrica, muitas vezes ela pode no trazer detalhes importantes sobre o erro ocorrido.
O tipo exception na realidade representa uma classe definida no .NET Framework. Toda e
qualquer exceo que ocorre deve ser derivada do tipo Exception. Dentro de um sistema .NET
podemos ter dois tipos de excees, as System Exceptions e as ApplicationExceptions. As system
exceptions so intrnsecas ao .NET Framework e dela derivam uma srie de outras excees
especializadas.
Podemos utilizar mais de um bloco catch dentro de um bloco try, a fim de tratar mais de um
tipo de exceo. Poderamos por exemplo tratar excees relacionadas a problemas no filesystem, a
problemas de permisso ou mesmo problemas de converso de dados. Para capturarmos estas
diferentes excees, devemos utilizar blocos catch especficos para este tipo de exceo, conforme
o exemplo a seguir.
try
{
StreamReader sr = new StreamReader("C:\\TESTE.TXT");
qualquer outro bloco catch, todas as excees cairiam neste bloco, pois ele foi colocado antes dos
blocos de tratamento para excees especficas.
importante notar tambm que em cada bloco catch temos disponvel uma varivel ex que
contem as informaes sobre a exceo gerada. Podemos ter propriedades diferentes para cada tipo
de exceo. No caso de uma FileNotFoundException, por exemplo, temos uma propriedade
chamada FileName que indica o arquivo que no foi encontrado.
Application Exception
As applicationExceptions so excees que podemos ser criadas dentro de nossa prpria
aplicao. Assim como o .NET Framework possui excees especficas, podemos criar classes que
representam excees que queremos gerar dentro de nosso sistema. Para criarmos uma exceo
customizada, devemos criar uma nova classe que herde as caractersticas da classe
ApplicationException. O exemplo a seguir mostra uma exceo customizada.
public class PXUException : ApplicationException
{
public string retCOM;
public string retUSU;
public string codFalha;
codFalha = cf;
}
}
Aps criarmos as excees, podemos lanar estas excees em nosso cdigo atravs do
comando throw. Este comando faz com que o sistema lance a exceo que deve ser tratada pela
rotina chamadora. Caso no seja tratada, a exceo faz com que o sistema seja abortado. A seguir
podemos ver um exemplo do comando throw.
throw new PXUException("00", "01", "1235");
O bloco finally
Alm do bloco try e dos blocos batch, o tratamento estruturado de excees ainda possui um
outro bloco opcional que pode ser utilizado, o bloco finally. O bloco finally serve para colocarmos
algum bloco de cdigo que deve ser executado independente de o processo ter executado com xito
ou de ter ocorrido uma exceo. Este tipo de bloco til para as situaes em que devemos fechar
conexes, fechar arquivos ou mesmo liberar algum recurso caro para o sistema operacional.
A seguir podemos ver a implementao de um bloco finally, onde fazemos o fechamento de
um arquivo caso ele tenha sido criado e esteja aberto.
StreamReader sr = null;
try
{
sr = new StreamReader("C:\\TESTE.TXT");
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
finally
{
if (sr != null)
sr.Close();
}
}
8.
Delegates e eventos
Introduo
Delegates
Delegates so similares aos ponteiros de funo disponveis nas linguagens C e C++.
Utilizando um delegate podemos encapsular uma referencia a um mtodo dentro de um objeto. O
objeto de delegate pode ser utilizado em qualquer ponto do cdigo para chamar o mtodo
referenciado, sem necessariamente saber em tempo de compilao qual o mtodo ser chamado.
O exemplo acima funciona para a maioria das situaes. Algumas vezes, porm, no
queremos chamar uma funo de forma direta, precisamos passar uma referencia desta funo para
que outra classe faa esta chamada. Isto extremamente til em sistemas baseados em eventos,
onde temos que definir uma funo em um formulrio, por exemplo, para tratar a resposta a um
click de um boto na tela.
Um delegate simples
Um ponto interessante sobre os delegates que no existe qualquer restrio ao tipo de objeto
ao qual ela est referenciando, o que importa que a funo referenciada possua os mesmos
O comando acima representa um delegate que recebe dois parmetros do tipo object e retorna
um tipo inteiro.
Os delegates iro permitir que especifiquemos o que a funo que vamos chamar deve
aceitar, e no qual funo iremos chamar.
class TestDelegate
{
public static void MinhaFuncao()
{
Console.WriteLine("I was called by delegate ...");
}
DelegateExemplo();
}
}
No exemplo acima, note que construimos o delegate passando como parmetro a funo que
ser chamada. Para chamarmos a funo apontada para o delegate, basta utilizar o nome da varivel
if (logHandler != null)
{
logHandler("Process() end");
}
}
}
No exemplo acima temos uma classe chamada MinhaClasse que possui uma funo chamada
Process. A funo aceita um parmetro do tipo delegate, que representa uma funo que ser
chamada para notificar sobre o andamento do processo. Na outra classe, onde a aplicao
executada, foi criada uma funo esttica com o nome de logger. Note que ao chamarmos a funo
Process passando uma instancia de um delegate que aponta para a funo esttica Logger da classe
de execuo do programa. Esta funo simplesmente mostra os valores na tela de console.
if (logHandler != null)
{
logHandler("Process() fim");
}
}
}
// Constructor
public FileLogger(string filename)
{
fileStream = new FileStream(filename, FileMode.Create);
streamWriter = new StreamWriter(fileStream);
}
No exemplo acima, utilizamos o operador += para adicionar uma funo ao delegate. Quando
o delegate for chamado pela classe MinhaClasse, ir chamar as duas funes associadas.
Eventos
O modelo de eventos do C# muito semelhante ao modelo de outras linguagens de
programao, inclusive ao do visual basic. Neste modelo trabalhamos com o conceito de publicador
e subscritor, onde o publicador ir enviar somente os eventos para os subscritores que subscreveram
aos seus eventos.
No C#, uma classe pode publicar uma srie de eventos para que outras classes possam
subscrever. Quando a classe publica um evento, todos as classes que subscreveram a este evento so
notificadas, conforme o exemplo a seguir.
Vamos modificar o exemplo que utilizamos nos delegates para utilizarmos uma
implementao atravs de eventos.
/* ========= Publicador ============== */
public class MinhaClasse
{
public delegate void LogHandler(string message);
// Declarao do evento
public event LogHandler Log;
// Constructor
public FileLogger(string filename)
{
fileStream = new FileStream(filename, FileMode.Create);
streamWriter = new StreamWriter(fileStream);
}
minhaClasse.Process();
fl.Close();
}
}
Na classe subscritora, temos a funo Main subscrevendo o evento Log para a as duas funes
de log, uma de arquivo e outra esttica.
9.
}
}
documento.SelectSingleNode("/xml/dados/registrousuario/"
}
set
{
documento.SelectSingleNode("/xml/dados/registrousuario/"
value;
}
}
campo).InnerText
cpf=\"12345678901\"
Overload de operadores
Outro recurso avanado que temos no C# a possibilidade da criao de overload de
operadores. Atravs deste recurso podemos fazer com que as classes criadas possam ser utilizadas
em operaes que envolvam os operadores de soma, subtrao e etc.
A definio de um overload de operadores muito semelhante a definio de um mtodo,
com a diferena que utilizamos a palavra reservada operator e o smbolo do operador ao invs do
nome do mtodo. O overload de operadores dever ter um tipo de retorno que ser utilizado na
operao bem como os parmetros, que representam o funcionamento da operao.
O exemplo a seguir mostra a utilizao de overload de operadores em uma classe chamada
Titulo que representa um titulo bancrio.
public class Titulo
{
public double valor;
public string codigoCedente;
//...
return tret;
}
}
// Overload do operador +
Titulo t3 = t1 + t2;
No exemplo acima criamos um overload para o operador + que permite a soma de duas
classes do tipo Titulo. Atravs da operao de soma, somamos os valores dois titulos gernado um
novo titulo que devolvido como resultado.
Note que a funo de overload do operador marcada com o atributo static. Este tipo de
construo obrigatria para overload de operadores.
Rotinas de converso
Da mesma forma que criamos os overloads de operadores, podemos criar overloads capazes
de realizar converses de dados. Podemos por exemplo fazer com que uma classe do tipo Titulo
possa ser convertida para um valor Double, onde ser atribudo o valor total do ttulo.
//...
No exemplo acima criamos uma funo de converso do tipo Titulo para o tipo double. A
declarao da funo customizada de converso semelhante ao overload de operador, porm
utilizada o tipo de destino ao invs do operador utilizado. Note tambm que o operador de
converso possui um parmetro explicit, que indica que a converso para este tipo de dado deve ser
realizada de forma explicita (utilizando um operador de cast). Poderiamos ter alterado esta
converso para que ela fosse feita de forma implicita, sem a necessidade de um operador de cast,
conforme exemplo a seguir.
public class Titulo
{
public double valor;
//...
{
public void Main()
{
Titulo t1 = new Titulo();
t1.valor = 15.50;
Comandos avanados no C#
Alm dos recursos de indexadores, overload de operadores e de funes de converso, o C#
ainda suporta alguns comandos avanados que devem ser observados.
byte n2 = 200;
// No resulta em erro
// mas sim em um nmero, 44
byte n3 = (byte)(n1 + n2);
// Exception aqui !
byte n3 = (byte)(n1 + n2);
}
Diretivas de processamento
As diretivas de processamento so comandos teis no C# para os casos em que queremos que
um determinado bloco de cdigo seja compilado somente em algumas situaes.
A compilao condicional realizada atravs de variveis de compilao, que so definidas
nas propriedades de projeto do visual studio.
{
#region Propriedades
#endregion
O atributo [Conditional]
Outra opo importante disponvel do C# o atributo Conditional. Este atributo semelhante
a compilao condicional, mas pode ser aplicado diretamente em mtodos. A vantagem deste
atributo que alm de remover a declarao do mtodo ele remove tambm as chamadas deste
mtodo presentes em todo o cdigo. Confira o exemplo a seguir.
class Program
{
[System.Diagnostics.Conditional("DEBUG")]
static void GravaLog()
{
// ... grava log
}
Console.WriteLine("Aplicao em teste!");
GravaLog("TESTE");
}
}
No exemplo acima, a funo GravaLog bem como suas chamadas s ser compilada no caso
de o smbolo DEBUG estar definido (ou seja, na compilao em modo debug). Caso este smbolo
no esteja definido, o mtodo e suas no sero compilados.
Introduo
Com o lanamento do .NET Framework 2.0, o C# ganhou suporte a uma nova funcionalidade,
chamada de Generics. Os generics permitem ao desenvolvedor a criao de placeholders (tambm
conhecidos como parmetros de tipos) para os tipos utilizados em parmetros de mtodos ou
mesmo para valores de retorno de funes. Estes tipos so definidos na criao do objeto em tempo
de execuo, ao invs de em tempo de compilao.
// boxing do numero 10
// em um object
lista.Add(10);
// unboxing da referencia
// object para o valor inteiro
int valor = (int) lista[0];
O namespace System.Collections.Generics
A biblioteca System.Collections.Generics possui itens semelhantes a sua irm no genrica
System.Collections. A diferena entre as duas bibliotecas que a biblioteca genrica permite a
criao de colees tipas, evitando as operaes de boxing e unboxing e aumentando o desempenho
do sistema.
// no necessrio utilizar
// funes de converso
int valor = lista[0];
Note que em tempo de execuo, definimos que a lista utilizaria valores inteiros, informando
o tipo int no parmetro T da coleo. Os parmetros para tipos genricos devem ser informados
entre os smbolos de menor que e maior que (< >).
Para entendermos como a linguagem monta este tipo de estrutura genrica, vamos analisar a
assinatura dos mtodos da prpria classe List<T>.
public class List<T> :
IList<T>, ICollection<T>, IEnumerable<T>,
IList, ICollection, IEnumerable
{
...
public void Add(T item);
public IList<T> AsReadOnly();
public int BinarySearch(T item);
Note que em todos os pontos onde antes indicvamos object ou mesmo um tipo especfico,
agora especificamos a letra T. Na declarao da classe, informamos tambm o parmetro <T> aps
a declarao da classe, o que indica que a classe genrica, e utiliza um tipo que ser definido na
utilizao do objeto.
public static void GravaLog<T>(T informacao)
{
string mensagem = informacao.ToString();
// ... grava log
}
No exemplo acima, indicamos que o mtodo GravaLog utiliza um tipo genrico. O tipo
genrico utilizado como parmetro para passarmos a informao que ser gravada na log. No caso
de mtodos genricos, devemos informar o tipo de dado na chamada do mtodo, conforme o
exemplo a seguir.
public void Main()
{
GravaLog<string>("TESTE");
GravaLog<int>(10);
GravaLog<DateTime>(DateTime.Now);
}
public T X
{
get {return m_v1;}
set { m_v1 = value; }
}
public T Y
{
get {return m_v2;}
set { m_v2 = value; }
}
No exemplo acima temos o exemplo de uma classe com o nome de coordenada, que pode
receber uma coordenada de qualquer tipo. Podemos utilizar uma coordenada que aceite tanto
inteiros como tambm strings.
public void Main()
{
Coordenada<int> localizacao = new Coordenada<int>(10, 20);
No construtor de uma classe genrica, podemos utilizar a palavra reservada default para
inicializar as variveis com os tipos no definidos para seus valores default. O C# inicializa valore
numricos com zero e valores reference type com null.
public class Coordenada<T>
{
T m_v1;
T m_v2;
public Coordenada()
{
m_v1 = default(T);
m_v2 = default(T);
}
public T X
{
get {return m_v1;}
set { m_v1 = value; }
}
public T Y
{
get {return m_v2;}
set { m_v2 = value; }
}
Podemos ainda criar um tipo que utilize mais de um tipo genrico. Para isto, basta informar
aps o primeiro tipo genrico uma vrgula e outra letra para representar o segundo tipo genrico,
conforme o exemplo.
public class Coordenada<T, U>
{
T m_v1;
U m_v2;
public Coordenada()
{
m_v1 = default(T);
m_v2 = default(U);
}
public T X
{
get {return m_v1;}
set { m_v1 = value; }
}
public U Y
{
get {return m_v2;}
set { m_v2 = value; }
}
Para implementarmos uma interface com um tipo genrico, basta informarmos o tipo desejado
na clusula que associa a interface a classe, conforme o exemplo a seguir.
public class BasicMath : IBinaryOperations<double>
{
public double Add(double arg1, double arg2)
{ return arg1 + arg2; }
...
}
Introduo
As aplicaes que criamos at o momento geravam apenas um mdulo, que quando executado
produzia um resultado qualquer. Na prtica, quando estamos trabalhando com um projeto .NET, a
tendncia criarmos uma soluo de forma mais modularizada, no colocando os componentes em
um nico projeto, mas sim em vrios projetos menores que facilitam a manuteno e o
reaproveitamento do cdigo.
Para criarmos estes projetos de forma distribuda, devemos fazer uso dos assemblys. Os
assemblys so nada mais nada menos que um conjunto de arquivos de cdigo compilados que
contm uma identidade, uma verso e uma assinatura. Podemos entender por assembly um arquivo
compilado em .NET, seja ele um .EXE ou um arquivo .DLL.
Criando um assembly
Os assemblys so representados por projetos do tipo Class Library. Estes projetos permitem a
criao de um conjunto de classes em um mdulo a parte, que ter como resultado final um arquivo
com a extenso.dll (um assembly). Este assembly poder ser posteriormente utilizado por outras
aplicaes.
Para criarmos um assembly, devemos criar um novo projeto no Visual Studio, o que pode ser
feito seguindo os seguintes passos.
1. Acesse o menu File do Visual Studio
2. Selecione a opo New Project
3. Selecione o tipo de projeto Class Library
4. Informe o nome da biblioteca e clique em ok. Caso voc j tenha um projeto aberto,
poder fazer com que este componente seja adicionado a mesma soluo, desta forma
voc poder trabalhar com vrios projetos de diferentes componentes ao mesmo tempo.
Referenciando um assembly
Aps criarmos o assembly, podemos referenci-lo em outros projetos afim de utilizar suas
classes. Para isso, basta acessarmos o solution explorer do projeto em questo e clicarmos com o
boto direito sobre a pasta References, selecionando a opo Add Reference.
As referencias podem ser adicionadas a partir de uma DLL em uma pasta qualquer do sistema
operacional atravs da opo browse, podem ser adicionadas a partir de um projeto da mesma
soluo, atravs da aba Projects ou podem ser adicionadas do repositrio global de assemblys (o
GAC) atravs da aba .NET.
Analisando as referencias
Em um projet, temos como verificar quais assemblys nosso projeto est fazendo uso. Para
isto, basta clicar expandir a pasta de References do Solution Explorer.
Se tentarmos incluir um assembly da aba .NET ao invs da aba Project ou Browse, iremos
perceber um comportamento diferente para estes componente. Se adicionarmos ao projeto o
componente System.Transactions por exemplo, ao compilarmos o projeto, podemos perceber que a
DLL deste componente no adicionada a pasta de compilao do projeto. Isto ocorre pois estes
assemblys so chamados assemblys compartilhados (shared assemblys). Tais assemblys esto
disponveis para toda a mquina na qual esto registrados. Um exemplo de shared assemblys so os
prprios componentes do .NET Framework (que iniciam com prefixo System). Estes componentes
no requerem uma cpia na pasta do projeto, pois esto disponveis globalmente para a mquina.
Para verificarmos o contedo do Global Assembly Cache, basta abrirmos o Windows
Explorer e acessarmos a pasta \WINDOWS\Assembly.
Basta marcamos a opo Sign the assembly e selecionarmos a chave desejada. Podemos
tambm criar uma chave nova atravs da opo New Key File... do combobox.
Aps especificarmos a chave, basta compilar a DLL novamente e instalar a DLL no GAC.
Gacutil i meuassembly.DLL
Binding policys
Conforme j falamos anteriormente, podemos ter mais de uma verso de um assembly
instalado na mquina. Nestas situaes, o programa que faz uso deste assembly utilizar a verso
com o qual ele foi compilado.
Apesar deste vnculo de verso existente nos executveis do .NET, podemos fazer com que a
solicitao dos componentes seja redirecionada para outras verses. Podemos por exemplo fazer
com que sempre que um programa solicitar a verso 1.0 de um assembly, ele seja direcionado a
utilizar a verso 2.0, mesmo que tenha sido compilado com a verso 1.0. Podemos criar este tipo de
configurao atravs da ferramenta de configurao do .NET Framework, que fica no painel de
controle da mquina.
Introduo
Neste captulo iremos analisar alguns conceitos avanados como Reflection, Late Binding e
Atributos de compilao. Estes recursos permitem buscar informaes sobre componentes e
assemblies utilizados em nossos projetos, bem como a carga dinmica de assemblys em tempo de
execuo.
Entendendo Reflection
Na arquitetura .NET, reflection significa descobrir informaes sobre um determinado tipo
em tempo de execuo. Utilizando os servios de reflection possvel obter metadados sobre um
determinado tipo, utilizando um object-model extremamente amigvel. Como qualquer outro
namespace, o namespace System.Reflection possui uma srie de tipos, que so utilizados para esta
busca de informao em tipos de dados. Alguns destes tipos podem ser observados na tabela a
seguir.
Tipo
Utilizao
Assembly
AssemblyName
Esta classe nos permite obter uma srie de informaes sobre a identidade do
assembly
EventInfo
Esta classe contem uma srie de informaes sobre eventos relacionados a uma
classe
FieldInfo
Esta classe contem uma srie de informaes sobre campos de uma classe ou
estrutura
MemberInfo
Esta classe contm informaes sobre membros em geral. Ela serve como classe
abstrata para a classe EventInfo, FieldInfo, MethodInfo e PropertyInfo
MethodInfo
Esta classe contem uma srie de informaes sobre mtodos de uma classe ou
estrutura
ParameterInfo
PropertyInfo
Esta classe contem uma srie de informaes sobre propriedades de uma classe
ou estrutura
A classe System.Type
A classe System.Type possui uma srie de membros que permite a anlise de um determinado
tipo em tempo de execuo. Por exemplo, podemos utilizar o mtodo Type.GetMethods() para
obter uma lista dos mtodos suportados pela classe, ou o mtodo GetFields() para obter uma lista de
todos os campos disponveis na classe. Alm disso, podemos utilizar propriedades como IsClass,
IsAbstract, IsEnum, etc. para saber mais informaes sobre o tipo de objeto que o tipo representa.
Para obtermos uma referencia a uma instancia da classe Ssytem.Type, podemos utilizar o
mtodo GetType que est disponvel na classe System.Object. Pelo fato deste mtodo estar
disponvel na classe System.Object, ele se faz presente em qualquer tipo do .NET, seja ele um tipo
primitivo ou um tipo customizado.
ContaCorrente cta = new ContaCorrente();
Outra opo utilizarmos a funo esttica GetType da classe Type. Neste caso, devemos
informar o nome do tipo e a biblioteca sob forma de um string.
Type tipo = Type.GetType("BERGS.ContaCorrente, ConsoleApplication1");
Ainda temos uma terceira maneira de obter uma instancia da classe Type para um
determinado tipo, utilizando a funo typeof().
ContaCorrente cta = new ContaCorrente();
Alm deste mtodos, ainda podemos utilizar algumas propriedades para mostrarmos certas
caractersticas do tipo.
Console.WriteLine("***** Fields *****");
FieldInfo[] fi = t.GetFields();
foreach(FieldInfo field in fi)
Console.WriteLine("->{0}", field.Name);
Console.WriteLine("");
asm = Assembly.Load("MyLib");
LoadFrom.
Assembly asm = null;
asm = Assembly.LoadFrom("C:\\MyLIB.DLL");
A classe System.Activator
Para criarmos uma instancia de um tipo no conhecido pelo programa, devemos utilizar a
classe System.Activator. Esta classe cria uma instancia de um tipo passado por parmetro, desde
que o assembly onde este tipo est contido esteja carregado.
A seguir podemos ver a utilizao da classe activator para a criao de um tipo de forma
dinmica. Note que o assembly foi carregado antes da criao do objeto.
Assembly asm = null;
asm = Assembly.LoadFrom("C:\\MyLIB.DLL");
asm = Assembly.LoadFrom("C:\\MyLIB.DLL");
MethodInfo mi = tipo.GetMethod("MinhaFuncao");
mi.Invoke(obj, null);
O segundo parmetro da classe Invoke representa os parmetros a serem passados, que neste
caso no existem.
asm = Assembly.LoadFrom("C:\\MyLIB.DLL");
MethodInfo mi = tipo.GetMethod("Soma");
[Serializable]
public class ContaCorrente
{
[Obsolete]
public void Sacar(double valor)
{
}
[Conditional("DEBUG")]
public void GravaLog()
{
[MTAThread]
public void Main()
{
}
No exemplo acima, utilizamos um atributo na classe para marc-la como uma classe
serializavel (veremos mais sobre este atributo no prximo captulo). Utilizamos tambm o atributo
[Conditional] no mtodo GravaLog, que j vimos anteriormente, e o atributo Obsolete no mtodo
Sacar, quer permite marcar um mtodo como obsoleto. Tambm utilizamos o atributo MTAThread
na funo main, quer marca nosso programa para suportar mltiplas threads.
13. Serializao
[NonSerialized]
public int idade;
}
No exemplo acima estamos marcando a classe cliente como serializavel. O atributo idade no
ser serailizado, pois pode ser recalculado a partir da data de nascimento.
importante salientar que o comportamento padro da serializao faz com que os campos
pblicos da classe sejam serializados. claro que o que ser serializado (campos pblicos ou
campos privados) depende muito do tipo de formatador utilizado. Se utilizarmos o BinaryFormatter
por exemplo, todos os campos da classe sero serializados, independente de pblicos ou privados.
J o XmlSerializer serializa apenas os campos pblicos da classe.
Utilizando o BinaryFormatter
Para avaliarmos como simples o processo de serializo no .NET, vamos utilizar a classe
BinaryFormatter para serializar um objeto do tipo Cliente.
A classe BinaryFormatter composto por dois mtodos principais, o Serialize e Deserialize.
Para serializarmos uma instancia de classe, devemos informara para o mtodo de serializao um
Stream, que pode ser um arquivo ou mesmo uma seqncia de bytes em memria.
BinaryFormatter bin = new BinaryFormatter();
cli.cpf = "77777777777";
cli.nomeCliente = "Teste";
cli.dataNascimento = new DateTime(1978, 11, 7);
bin.Serialize(file, cli);
file.Close();
O mtodo Serialize aceita como parmetro um stream onde sero armazenados os dados e
uma instancia do objeto a ser serializado. O processo extremamente simples.
Para deserializarmos um objeto, o processo exatamente o inverso, conforme mostrado no
exemplo a seguir.
Utilizando o SoapFormatter
O SoapFormatter funciona de forma muito semelhante ao BinaryFormatter, porm serailiza o
objeto em um formato SOAP. Este tipo de formatador um forte canditado para quando queremos
serializar os dados para o envio atravs da internet. A seguir temos um exemplo de serializao do
bin.Serialize(file, cli);
file.Close();
Utilizando o XmlSerializer
O XmlSerializer funciona de uma forma um pouco diferente dos outros formatadores e
utilizado para os casos em que queremos persistir um determinado objeto em formato XML. Para
utilizarmos o XmlSerializer, devemos criar uma instancia da classe XmlSerializer passando como
parmetro os tipos que sero suportados para serializao.
No exemplo a seguir, temos o mesmo exemplo de serializao da calsse cliente, porm
utilizando a classe XmlSerializer para serializao.
XmlSerializer xml = new XmlSerializer(typeof(Cliente));
bin.Serialize(file, cli);
file.Close();
[NonSerialized]
public int idade;
}
O que o ADO.NET ?
O ADO.NET uma nova tecnologia baseada no ADO (Active Data Objects), com muito mais
recursos. O ADO.NET possui um modelo para manipulao de dados completamente diferente da
verso anterior do ADO, simplificando o processo de conexo e manipulao de dados.
A arquitetura do ADO.NET foi criada para trabalhar com um ambiente desconectado, ou seja,
buscamos as informaes do banco de dados e trazemos para a memria da aplicao. A
manipulao dos dados feita toda em memria e posteriormente enviada ao banco de dados.
Por trabalhar de uma forma voltada ao modelo desconectado, o ADO.NET possui uma
camada de persistncia em XML. possvel gravar e ler todo o contedo de todo um conjunto de
armazenado nas estruturas do ADO.NET em XML.
O ADO.NET faz parte do .NET Framework, e composto por um conjunto de classes,
interfaces, tipos e enumeraes.
de dados simultaneamente. possvel armazenar duas tabelas de diferentes bancos de dados (SQL
Server e Access por exemplo) em uma mesma estrutura de dados (DataSet).
A estrutura responsvel pelo armazenamento dos dados o dataset, que contm um conjunto
de objetos (DataTables) que representam resultados tabulares extrados da base de dados. Estes
resultados podem ser extrados de tabelas de bancos de dados diferentes.
Para fazer a extrao dos dados, o ADO.NET utiliza os chamados .NET Data Providers. Os
Data Providers so bibliotecas de classes especializadas para o acesso a um tipo de banco de dados
relacional. Por serem uma implementao especfica para o banco de dados, estas possuem um
acesso bem mais eficiente do que outras bibliotecas como a OleDb.
Apesar de serem uma implementao especfica para um tipo de banco de dados, as classes
dos Data Providers possuem uma estrutura comum.
A string de conexo possui uma srie de parmetros, que pode variar de acordo com o banco
de dados utilizado. Os parmetros da string de conexo so separados por ponto e vrgula, e devem
ser informados com a seguinte notao:
Nome do Parmetro=Valor do Parmetro
Os parmetros mais comuns para as strings de conexo podem ser observados na tabela a
seguir.
Data Source
- ou Indica o nome do servidor
Server
Integrated Security
Indica se ser utilizada autenticao integrada ou no.
- ou
utilizada
pelo Sql Server
Trusted Connection
Initial Catalog
- ou Indica o banco de dados inicial
Database
User Id
Indica o usurio para conexo
Password
Provider
Criando comandos
possvel executar comando no banco de dados atravs da classe SqlCommand. Ao criar um
objeto dessa classe, devemos informar o comando Sql a ser executado, bem como a conexo a ser
utilizada. Estes parmetros podem ser informados tanto no construtor da classe SqlCommand como
tambm atravs das propriedades CommandText e Connection.
Os comandos SQL informados em um objeto de comando podem ser de qualquer tipo: que
retornam um conjunto de linha, que retornam um valor especfico, ou que no retornam nenhuma
quer. Cada um destes tipos de comando SQL possui um mtodo para execuo.
Atravs da classe SqlCommand tambm possvel executar Stored Procedures do banco de
dados, sendo necessrio apenas informar o nome da stored procedure no parmetro CommandText,
e setar a propriedade CommandType da classe para CommandTypes.StoredProcedure.
oCmd.Connection = oConn;
oCmd.CommandText = "UPDATE Products SET UnitPrice=UnitPrice*1.05";
Executando commando
Para executarmos os comandos especificados na classe SqlCommand, precisamos executar
um dos mtodos de execuo disponveis. Os mtodos de execuo variam de acordo com a
natureza do comando executado. Os trs mtodos mais comuns so:
O mtodo ExecuteNonQuery
O mtodo ExecuteNonQuery utilizado quando queremos executar um comando que no
retorna como resultado um conjunto de dados. Este mtodo utilizado para comandos de
atualizao e insero e tambm para comando DCL (Data Control Language) suportados pelo
banco de dados.
Opcionalmente podemos informar um parmetro para este mtodo para obter o nmero de
linhas afetadas pelo comando executado.
Um exemplo de utilizao do comando ExecuteNonQuery pode ser observado a seguir.
SqlCommand
UnitPrice=UnitPrice*1.1");
oCmd
new
SqlCommand("UPDATE
Products
SET
oCmd.Connection = oConn;
oCmd.CommandText = "UPDATE Products SET UnitPrice=UnitPrice*1.05";
oCmd.ExecuteNonQuery();
O mtodo ExecuteScalar
O mtodo ExecuteScalar utilizado para comandos que retornam valores escalares, ou seja,
valores nicos. Em geral utilizado para comandos que retornam uma contagem de registros ou que
executam ao comando de agregao no banco de dados.
oCmd
new
SqlCommand("UPDATE
Products
SET
oCmd.Connection = oConn;
oCmd.CommandText = "SELECT COUNT(*) FROM Products";
int iNumProdutos;
iNumProdutos = oCmd.ExecuteScalar();
O mtodo ExecuteReader
O mtodo ExecuteReader utilizado para executar querys que retornam um conjunto de
dados. Este mtodo tem como resultado um objeto do tipo SqlDataReader.
A classe SqlDataReader representa um cursor aberto no banco de dados com os dados
retornados pela query informada no objeto de comando.
Para lermos os dados de um DataReader, necessrio executamos o mtodo Read. Este
mtodo retorna verdadeiro caso um registro tenha sido lido do cursor do banco de dados, e falso
quando no houver mais registros a serem lidos. necessrio chamar o mtodo Read pelo menos
uma vez, pois o cursor aberto no fica posicionado no primeiro registro.
Como o DataReader mantm um cursor aberto com o banco de dados, no possvel realizar
nenhuma operao no banco de dados (utilizando a conexo utilizada pelo DataReader) enquanto o
DataReader estiver aberto. Por tanto, necessrio fechar o DataReader imediatamente aps a sua
utilizao.
Um exemplo de utilizao do mtodo ExecuteReader e da classe DataReader pode ser
observado a seguir.
SqlCommand oCmd = new SqlCommand("SELECT ProductName, ProductId FROM Products",
oConn);
SqlDataReader oDr;
oDr = oCmd.ExecuteReader();
while (oDr.Read()) {
Debug.WriteLine(oDr("ProductName").ToString());
}
Passando parmetros
possvel passar parmetros para os objetos da class SqlCommand. Para indicarmos
parmetros nas querys informadas neste objeto, utilizamos o smbolo @ como prefixo para indicar
um parmetro. Esta sintaxe pode variar de acordo com o banco de dados utilizado (o Oracle utiliza
: por exemplo).
oCmd.Connection = oConn;
oCmd.CommandText = "UPDATE Products " + " SET UnitPrice=@UnitPrice " + " WHERE
ProductId=@ProductId";
oCmd.ExecuteNonQuery();
O que um DataSet ?
O DataSet uma classe capaz de armazenar mltiplos resultados tabulares em uma mesmo
estrutura. O dataset composto por estruturas chamadas DataTables que representam estes
resultados tabulares.
Para extrairmos dados da base de dados e preenchermos o DataSet utilizamos a classe
DataAdapter. Esta classe capaz de executar os quatro comandos bsicos de um banco de dados
(Insert, Update, Delete, Select) sendo capaz de executar estas operaes sobre os dados do dataset.
O que um DataAdapter ?
O DataAdapter a classe responsvel por fazer a interao entre a base de dados e o DataSet.
Ela possui quatro propriedades que representam os quatro comandos principais que utilizamos para
interagir com o banco de dados.
Para realizar a extrao de dados do banco de dados para o DataSet, o DataAdapter usa o
comando de select, contido na propriedade SelectCommand.
Aps extrairmos os dados para o DataSet, podemos modificar estes dados (que esto
armazenados em memria). medida que modificamos os dados do DataSet, este faz uma
marcao nas alteraes que fazemos, marcando as linhas inseridas como inseridas, modificadas
como modificados e excludos como excludos. Quando conclumos as alteraes, possvel
chamar o DataAdapter novamente para que ele execute para cada linha modificada o comando
correspondente a modificao realizada.
O que o ASP.NET ?
O ASP.NET uma evoluo do antigo ASP. Assim como seu antecessor, o ASP.NET permite
a construo de pginas Web dinmicas que acessam recursos do servidor.
Diferente do ASP, o ASP.NET possui uma estrutura bem mais flexvel e organizado, por
utilizar todo o conceito de orientao a objetos no desenvolvimento das aplicaes.
Alm de ser mais flexvel, o ASP.NET tambm bem mais robusto e rpido, por no ser uma
linguagem interpretada e sim compilada. Toda a pgina criada em .NET possui um mdulo
compilado correspondente.
O ASP.NET trabalha com o conceito de formulrios Web, que muito semelhante ao
conceito de construo de aplicaes com formulrio para Windows, utilizado pelo Visual Basic
6.0. Atravs do ASP.NET podemos criar formulrio que geram cdigo HTML para o browser.
O .NET Framework verifica a linguagem em que a pgina foi escrita e cria uma verso
compilada da mesma.
O cdigo compilado armazenado em uma DLL, que fica guardada em um cache temporrio.
Esta DLL carregada em memria e a pgina ento executada. O resultado HTML gerado pela
execuo da pgina devolvido para o browser do cliente.
Nas chamadas subseqentes a esta pgina, o framework utilizara a verso da pgina
compilada, o que evita uma re-interpretao de todo o cdigo.
O que um WebForm ?
Os formulrios web so formulrios dinmicos processados no servidor que geram resultados
HTML para o cliente. Os formulrios Web possuem um conceito semelhante ao conceito dos
formulrios desenvolvidos para windows, com a diferena que estes formulrios tratam seus
eventos no servidor.
Todo o formulrio Web possui a extenso aspx, e fica armazenado no servidor web.
Alm da extenso, todo o formulrio web possui uma diretiva de pgina representada pela tag
a seguir:
<%@ Page Language="cs" %>
Alm da diretiva de pgina, os webforms possuem outras tags tambm utilizadas em pginas
asp, porm com alguns atributos adicionais.
A tag form tambm possui alguns atributos adicionais, como o atributo runat=server que
indica que este formulrio ser processado no servidor, permitindo que o ASP.NET realize o
processamento e identifique os controles contidos nesse formulrio.
importante salientar que um Web form possui uma tag form com o atributo runat=server,
pois a arquitetura do ASP.NET considera cada pgina como um formulrio, no sendo possvel
criar mais de um formulrio com referencia no servidor para a mesma pgina. Apesar disso,
possvel criar formulrios convencionais nestas pginas (sem o atributo runat=server).
Entendendo os WebForms
Os Web Forms do ASP.NET funcionam de uma forma muito diferente das antigas pginas
ASP. Dentre as caractersticas que encontramos nos WebForms, podemos encontrar as seguintes:
Atributos: Alm dos atributos normais, encontramos alguns atributos especiais nas tags dos
webforms. Um destes atributos o atributo runat=server. Este atributo indica que o formulrio
possui uma referncia no servidor, e que deve ser processado de acordo com as regras do ASP.NET.
Alm do atributo runat=server, o formulrio tambm possui uma identificao (id) que
identifica o formulrio no servidor.
Eventos: Todo o processamento feito por meio de objetos e eventos. A pgina montada
em resposta aos eventos que ocorrem durante o processamento.
considerado uma classe. a partir da implementao desta classe que criamos o funcionamento do
nosso Web Form.
A seguir temos um exemplo da seo HTML e do cdigo fonte de um Web Form:
<%@ Page Language="cs" %>
<HTML>
<body>
<form id="Form1" method="post" runat="server">
<asp:TextBox ID=txtNome Runat=server></asp:TextBox>
<asp:Button id="Button1" runat="server"
Text="Button"></asp:Button><BR>
<INPUT id="Checkbox1" type="checkbox"
name="Checkbox1"
runat="server" EnableViewState="True">
</form>
</body>
</HTML>
<Script runat=server>
Sub Page_Load
txtNome.Text = "Aluno !"
End Sub
</Script>
medida que a pgina enviada para o servidor para processamento e retorna, os valores dos
controles web no so perdidos (como no modelo do asp por exemplo).
As caractersticas dos controles web so todas controlados pelo servidor e podem ser alteradas
no tratamento dos eventos que ocorrem durante o processamento da pgina.
Outra caracterstica dos controles web que eles geram cdigo especifico para o browser que
o client est utilizando. Se um controle web envia um bloco de script para o browser por exemplo,
ele pode possuir uma funcionalidade especial para browsers que no suportam cdigo script.
A referncia no servidor
A referncia no servidor se da a partir da criao de variveis criadas na classe que representa
o formulrio web na pgina code-behind. Esta varivel deve possui o mesmo nome do Id indicado
para o controle na pgina de layout (aspx).
O tipo da classe tem uma correspondncia a uma classe do .NET Framework, que indica a
funcionalidade bsica dos controles.
Como estas variveis possuem um escopo de classe, elas so visveis em qualquer mtodo
implementado dentro da classe do formulrio.
Um exemplo de declarao de dois controles Web pode ser observado a seguir.
protected System.Web.UI.WebControls.Button Button1;
WebServer Controls
Os controles web podem ser divididos em duas categorias, os Web Server controls e os
HTML Server Controls.
Os Web Server controls so controles que possuem uma tag diferenciada. Apesar de
possurem esta tag, o resultado de seu processamento sempre HTML, ou seja, eles sempre
enviando HTML para o browser.
Os controles web podem ser dividos nas seguintes categorias:
web.
Por serem controles gerados a partir de tags HTML, podemos ter um controle maior sobre o
HTML final gerado para o usurio.
Assim como os Web Server Controls, os HTML server controls possuem classes no
framework que implementam sua funcionalidade bsica.
O object model dos HTML server controls muito semelhando ao do Javascript, ou seja, as
propriedades e mtodos disponveis nos controles extremamente parecida as encontradas no
modelo utilizado nas linguagens client (javascript e vbscript).
Navigate URL
Visualizar Logs
viewLogs.aspx
Saldo
Saldo.aspx
O que so Cookies ?
Cookies so informaes textuais enviadas do cliente par ao server e do server para o client
atravs do header http. Cada vez que requisitamos e recebemos uma pgina, um cookie pode
acompanhar o header http deta requisio.
Os cookies so gereciados pelo navegador (browser) e podem ser de dois tipos:
Response.Cookies.Add(oCookie);
O controle de sesso
A sesso do usurio com o ASP.NET pode ser customizada atravs de parmetros
encontrados no web.config. Podemos alterar informaes como o tempo de expirao e o modo de
funcionamento da sesso atravs das propriedades do elemento sessionState do web.config.
O atributo timeout indica o tempo de durao da sesso em minutos. Um exemplo de
customizao de sesso no arquivo web.config pode ser observado a seguir.
<sessionState
mode="InProc"
stateConnectionString="tcpip=127.0.0.1:42424"
sqlConnectionString="datasource=127.0.0.1;
Trusted_Connection=yes"
cookieless="false"
timeout="20"
/>
Iniciando o StateServer
Uma das opes que temos para armazenamento de sesso o state server. O state server
um servidor instalado com o .NET Frameowork que gerencia os dados de sesso de um servidor
ASP.NET. Para utilizarmos um stateserver, basta alterarmos o modo de gerenciamento de sesso no
web.config para state server e iniciar o servio de gerenciamento de estado do servidor que ser o
state server.
Variveis de aplicao
As variveis de aplicao so variveis disponveis para a aplicao como um todo,
independente da sesso do usurio que estiver acessando o contedo da varivel.
A criao destas variveis feita exatamente da mesma forma que as variveis de sesso,
porm utilizando o objeto application.
Por estarem disponveis para todos os usurios da aplicao, esta varivel necessita controle
de concorrncia em sua gravao. Sempre que vamos gravar uma varivel de aplicao, devemos
chamar o mtodo Lock. Ao gravar o valor, devemos chamar o mtodo Unlock.
Um exemplo de criao de uma varivel de aplicao pode ser observado a seguir.
Application.Lock()
Application("NumVisitantes") = _
Convert.ToDouble(Application("NumVisitantes")) + 1
Application.UnLock()
O arquivo global.asax
O arquivo global.asax gerencia os eventos globais da aplicao. Atravs dele podemos criar
variveis na inicializao da aplicao ou da sesso do usurio.
O Global.ASAX tambm possui eventos para mapear as requisies feitas a aplicao, alm
de possibilitar o tratamento de erros ocorridos em toda a aplicao.
Eventos do global.asax
Os eventos mais importantes disponveis no arquivo global.asax so:
Session_OnStart
Session_OnEnd
Application_OnStart
Application_OnEnd
Application_Error
Application_BeginRequest
O arquivo Machine.Config
O arquivo Machine.Config contm as relativas a mquina como um todo.
Neste arquivo encontramos os valores default que se aplicam a todas as aplicaes ASP.NET
que se encontram na mquina em questo.
Alm destas informaes, encontramos no elemento Process Model algumas informaes
relativas ao processo que executa e processa as pginas ASP.NET. Podemos, por exemplo, alterar o
contexto do usurio que executa a aplicao ASP.NET para um outro usurio (de um domnio por
exemplo). Para isto basta alterar a propriedade UserName e Password do elemento ProcessModel
do machine.config.
O arquivo Web.Config
O arquivo Web.Config possui informaes referentes a uma pasta de uma aplicao Web.
Neste arquivo encontramos configuraes relativas a uma aplicao web ou a uma pasta de
uma aplicao web especificamente.
Dentro deste arquivo podemos definir parmetros de configurao como:
Configurao do TRACE
Configuraes de Cultura
Configuraes de autenticao e autorizao
Linguagem default para compilao
Hierarquia de configuraes
Os arquivos de configurao possuem uma relao totalmente hierrquica, ou seja, alguns
parmetros de configurao criados em um nvel de configurao superior podem ser sobrescritos
em um nvel inferior.
Um exemplo disso so as configuraes encontradas no machine.config. Dentro deste arquivo
encontramos os settings default para uma aplicao ASP.NET, como configurao de trace, modelo
de autenticao e etc. Se estas mesmas configuraes forem colocadas em um arquivo Web.Config
de uma aplicao, para esta aplicao valeram os valores do Web.Config da aplicao e no do
machine.config.
sConnString = ConfigurationSettings.AppSettings[ConnString"]
System.Web.Services
System.Web.Services.Description
System.Web.Services.Discovery
Utilizado em aplicaes
<%@ WebService
Language="cs"
Codebehind="inf_fiscais.asmx.cs"
Class="EmpresaABC.Informacoes_Fiscais" %>
Criando mtodos
Na classe associada ao web service, devemos implementar os mtodos que estaro
disponveis atravs da internet.
No basta criar mtodos pblicos na classe para que eles estejam disponveis atravs da
internet, preciso informar o atributo WebMethod antes da definio do mtodo.
Um exemplo de implementao de um web method pode ser observado a seguir.
[WebMethod()]
public DataSet BuscaBalanco()
{
...
}