Vous êtes sur la page 1sur 120

Microsoft Visual C#

1.

A LINGUAGEM DE PROGRAMAO COM MICROSOFT .NET ................. 6 a. Introduo ao .NET e ao Framework .NET ............................................... 6 b. Execuo multiplataforma. .................................................................... 6 c. Suporte multilinha. .............................................................................. 7 d. Padres de desenvolvimento C# ............................................................ 8 e. Endentao de cdigo ........................................................................... 8 f. Comentrios ........................................................................................ 9

g. Comentrios de classes e mtodos ....................................................... 10 h. Declaraes ...................................................................................... 10 i. 2. Criando um Projeto de Aplicao para Windows ..................................... 15 ENTENDENDO OS FUNDAMENTOS DA LINGUAGEM C#..................... 23 a. Fundamentos .................................................................................... 23 b. Usando tipos predefinidos no C#.......................................................... 24 c. Os delimitadores de bloco { } .............................................................. 26 d. Outras declaraes condicionais ........................................................... 26 e. Exerccios ......................................................................................... 42 3. CRIANDO OBJETOS EM C# .............................................................. 42 a. Classes Abstratas, classes Seladas e Interfaces ..................................... 42 b. Introduo ........................................................................................ 42 c. O que uma classe abstrata? (Abstract Class) ...................................... 43 d. O que uma Interface? (Interface) ...................................................... 43 e. Classes Abstratas X Interfaces ............................................................. 44 f. O que uma classe selada? (Sealed Class) ........................................... 44

g. Classes Abtratas x Interfaces .............................................................. 45

Microsoft Visual C# h. Declarando mtodos........................................................................... 46 i. j. Moderadores de acesso....................................................................... 46 Estrutura dos mtodos ....................................................................... 47

k. Usando Construtores de Instncias ...................................................... 48 4. TCNICAS DE PROGRAMAO ORIENTADA A OBJETO EM C# .......... 51 a. Classes e Objetos .............................................................................. 51 b. Criando Objetos ................................................................................. 52 c. Usando Herana ................................................................................ 55 d. Polimorfismo ..................................................................................... 56 e. Exerccios ......................................................................................... 58 5. CRIANDO UMA APLICAO WEB ..................................................... 58 a. Criando um formulrio para aplicaes Web .......................................... 58 b. Criando uma Master page ................................................................... 59 c. Utilizando uma Mater Page .................................................................. 59 d. Trabalhando com uma Master Page ...................................................... 61 e. Alterando o Ttulo das pginas de contedo ........................................... 63 f. Master Pages aninhadas ..................................................................... 64

g. Criando Master Page .......................................................................... 65 h. Acessando dados atravs do formulrio de aplicaes Web ..................... 70 i. j. Modos de Configurao ....................................................................... 71 Utilizando a Sesso ............................................................................ 73

k. Exerccios ......................................................................................... 77 6. PROGRAMAO EM CAMADAS COM C# ............................................ 77 a. Criando a infra-estrutura de Banco de dados ......................................... 80 b. Criando a tabela de Clientes ................................................................ 82 c. Camada de Acesso a Dados ................................................................. 93

Microsoft Visual C# d. Implementar as classes da Camada DAL (Data Access Layer). ............... 108 e. BLL Camada de Regras de Negcio. ................................................. 133 f. Criando a interface com o usurio Desktop application ....................... 145

g. User Interface Formulrio de Produtos ............................................. 168 h. User Interface Formulrio de Vendas ............................................... 177 i. j. User Interface Formulrio de Produtos em Falta ................................ 182 Testando as Regras de Negcio ......................................................... 187

k. Estrutura de Arquivos ....................................................................... 188 l. 7. Vantagens do modelo de desenvolvimento em Camadas ....................... 189 USANDO ADO.NET PARA ACESSO A DADOS ................................... 190 a. Arquitetura ADO.NET ........................................................................ 190 b. A arquitetura ADO .NET ( System.Data ) ............................................. 190 c. System.Data ................................................................................... 191 d. DataSet .......................................................................................... 191 e. DataTable ....................................................................................... 192 f. DataRow ......................................................................................... 193

g. DataRelation ................................................................................... 193 h. System.Data.OleDB.......................................................................... 194 i. j. System.Data.SQLClient..................................................................... 194 Criando uma aplicao usando ADO.NET e SQLServer Express .............. 194

k. Introduo a Banco de Dados ............................................................ 195 l. Histrico do acesso aos Dados. .......................................................... 198

m. O que ADO.NET? ........................................................................... 199 n. DataBind ........................................................................................ 204 o. Utilizando o DataReader ................................................................... 205 p. Utilizando o DataSet ......................................................................... 215

Microsoft Visual C# 8. INTRODUO AO ADO.NET ENTITY FRAMEWORK ......................... 231 a. Implementando CommandTimeOut em DataSets Tipados ..................... 236 b. Introduo ao LINQ para SQL ............................................................ 243 c. .NET Framework 3.5......................................................................... 244 d. O/R Mapping ................................................................................... 244 9. CRIANDO UM WINDOWS SERVICE ................................................ 247 a. Entendendo suas necessidades .......................................................... 247 b. Execuo de processos peridicos ...................................................... 251 c. Interao entre camadas .................................................................. 253 d. Testando o Controller ....................................................................... 257 e. Finalmente criando o Windows Service ............................................... 260 10. USANDO XML WEB SERVICES DE UMA APLICAO C# .................. 264 a. Primeiros Passos no WebService ........................................................ 264 b. Implementando WebServices ............................................................ 265 c. Criando meu primeiro WebService ..................................................... 266 d. Consumindo o meu primeiro WebServie ............................................ 269 e. Criando um Web service de clculo .................................................... 271 f. 11. 12. 13. Consumindo Web Service em C-Sharp Parte 2 ......................................... 274 USANDO SOAP HEADERS SEGURANA EM WEBSERVICE ............ 280 NOVA IDE DO VISUAL STUDIO 2010 CRIADA COM WPF ................ 283 CONSIDERAES EXTRAS ............................................................. 288 a. Explorando o AJAX ........................................................................... 288 b. Documentao de Projeto ................................................................. 290 c. Utilizando UserControls ..................................................................... 294 d. Carregando dinamicamente na pagina ................................................ 300

Microsoft Visual C# e. Class Libary .................................................................................... 300 f. Classe Exportador XLS ...................................................................... 302

g. Utilizando uma DLL (Class Libary) ...................................................... 303 h. Distribuindo sua Aplicao ................................................................ 306 i. j. Testes Unitrios ............................................................................... 307 Criando Relatrio com ReportViewer em ASP.NET ................................ 311

Microsoft Visual C# 1. A linguagem de programao com Microsoft .NET a. Introduo ao .NET e ao Framework .NET Para o desenvolvimento e execuo de aplicaes neste novo meio tecnolgico, Microsoft proporciona o conjunto de ferramentas conhecido como .NET Framework SDK, que possvel baix-lo gratuitamente de seu site web site diretamente na Microsoft e inclui compiladores de linguagens como C#, Visual Basic.NET, Managed C++ e JScript.NET especificamente desenhados para criar aplicaes para ele. O corao da plataforma.NET o CLR (Common Language Runtime), que uma aplicao similar a uma mquina virtual que se encarrega de providenciar a execuo das aplicaes para ela escritas interagindo com uma Coleo de Bibliotecas Unificadas, que juntas so o prprio framework. Esta CLR capaz de executar, atualmente, mais de vinte diferentes linguagens de programao, interagindo entre si como se fossem uma nica linguagem. Estas so: APL; Boo; Fortran; Pascal; C++; Haskell; Perl; C#; Java; Python; COBOL; Microsoft JScript; RPG; Component Pascal; Mercury; Scheme; Curriculum; Mondrian; SmallTalk; Eiffel; Oberon; Standard ML; Forth; Oz; Microsoft Visual Basic; Delphi; J#; Ruby; Lua. So oferecidos a estas aplicaes numerosos servios que facilitam seu desenvolvimento e manuteno que favorece sua confiana e segurana. Entre eles os principais so: Modelo de programao consistente e simples, completamente orientado a objetos. Eliminao do temido problema de compatibilidade entre DLLs conhecido como "inferno das DLLs". b. Execuo multiplataforma. Execuo multilinguagem, o principio de que possvel, em um programa escrito em C#, fazer coisas como capturar uma exceo de um outro programa escrito em Visual Basic.NET que por sua vez herda funcionalidades de um tipo de exceo escrita em Cobol.NET. Embora anteriormente houvssemos dito que no .NET Framework somente se oferecem compiladores de C#, MC++, VB.NET e JScript.NET, o certo que a parte Microsoft e terceiros esto desenvolvendo verses adaptadas a .NET de

Microsoft Visual C# muitssimas outras linguagens como APL, CAML, Cobol, Eiffel, Fortran, Haskell, Java, Mercury, ML, Mondrian, Oberon, Oz, Pascal, Perl, Python, RPG, Scheme ou Smalltalk. c. Suporte multilinha. Gesto do acesso a objetos remotos que permite o desenvolvimento de aplicaes distribudas de maneira transparente ao encontro real de cada um dos objetos utilizados nas mesmas. Segurana avanada at o ponto de que possvel limitar as permisses de execuo do cdigo em funo de sua procedncia (Internet, rede local, CD-ROM, etc.), o usurio que o executa ou a empresa que o criou. Interoperabilidade com cdigo pr-existente, de forma que possvel utilizar com facilidade qualquer livraria de funes ou objetos COM e COM+ criados com anterioridade apario da plataforma .NET. Adequao automtica da eficincia das aplicaes s caractersticas concretas de cada mquina onde for executar. Microsoft .NET uma iniciativa da Microsoft em que visa uma plataforma nica para desenvolvimento e execuo de sistemas e aplicaes. Todo e qualquer cdigo gerado para .NET, pode ser executado em qualquer dispositivo ou plataforma que possua um framework: a "Plataforma .NET" (.NET Framework). Com idia semelhante plataforma Java, o programador deixa de escrever cdigo para um sistema ou dispositivo especfico, e passa a escrever para a plataforma .NET. Arquitetura .NET, A plataforma .NET se baseia em um dos principios utilizados na tecnologia Java (compiladores JIT), os programas desenvolvidos para ela so duplo-compilados, ou seja so compilados duas vezes, uma na distribuio e outra na execuo. Um programa escrito em qualquer das mais de vinte linguagens de programao disponvel para a plataforma, o cdigo fonte gerado pelo programador ento compilado pela linguagem escolhida gerando um cdigo intermedirio em uma linguagem chamada MSIL[1] (Microsoft Intermediate Language).
[1] O fato desta arquitetura utilizar a MSIL gera uma possibilidade pouco desejada entre os criadores de software que a de fazer a "engenharia reversa", ou seja, a partir de um cdigo compilado, recuperar o cdigo original. Isto no uma idia agradvel para as empresas que sobrevivem da venda de softwares produzidos nesta plataforma. Por causa disso, existem ferramentas que "ofuscam" este cdigo MSIL, trocando nomes de variveis, mtodos, interfaces e etc para dificultar o trabalho de quem tentar uma engenharia reversa num cdigo compilado MSIL.

Microsoft Visual C# Este novo cdigo fonte gera um arquivo chamado de Assembly, de acordo com o tipo de projeto: EXE - Arquivos Executveis, Programas. DLL - Biblioteca de Funes. ASPX - Pgina Web. ASMX - Web Service. No momento da execuo do programa ele novamente compilado, desta vez pelo JIT (Just In Time Compiler), de acordo com a utilizao do programa, por exemplo, temos um Web Site desenvolvido em ASP.NET[2], ao entrar pela primeira vez em uma pgina o JIT ir compila-la, nas outras vezes que algum outro usurio acessar esta pgina, ele usar esta compilao. Tambm possvel, atravs de ferramentas especficas, "pr-compilar" o cdigo para que no se tenha o custo da compilao JIT durante a execuo. A Microsoft disponibiliza gratuitamente uma verso para download do Visual Studio 2008 Express Edition atravs do link: http://www.microsoft.com/express/vcsharp/Default.aspx d. Padres de desenvolvimento C# O objetivo elaborar uma padronizao para o desenvolvimento em C#, considerando os seguintes tpicos: Padronizao de nomenclatura usada na programao de mtodos, objetos, variveis e constantes. Alm disso, trata como dever ser feita a documentao dentro do cdigo. e. Organizao de cdigo Alguns trechos de cdigo podem ficar muito extensos e voc dever encarar o dilema de quebrar a linha. Quebrar a linha aps uma vrgula; Quebrar a linha aps um operador; Alinhar a nova linha no inicio da expresso no mesmo nvel da linha anterior.

[2] ASP.NET a plataforma da Microsoft para o desenvolvimento de aplicaes Web e o sucessor da tecnologia ASP.

Microsoft Visual C# Exemplo: this.calcularDiferenca(intVal1, intVal2, intVal3, intVal4, intVal5); ou intVal1 = intVal2 * (intVal4 - intVal5 + intVal6) + 4 * intVal7; Outro fator importante a utilizao de espaos em branco para

endentao. No use espaos em branco para endentao, use tabulao. Motivos: Facilidade de incrementar e decrementar blocos de cdigo atravs de atalhos de teclas do editor de cdigo. f. Comentrios Utilizar as trs barras /// para comentrios de classes e mtodos. O motivo utilizar a funcionalidade do Visual Studio .NET de transformar comentrios em documentao de cdigo. Entretanto, para comentrios que no necessitam ser publicados, existem algumas dicas. Para comentrios que so importantes para voc ou outra pessoa ser orientada sobre a manuteno de um cdigo fonte, tenha ateno forma de destacar o comentrio. Por exemplo, comentrios com mais de uma linha poderiam ser assim: /** Exemplo de comentrio no cdigo fonte para orientao do profissional que dar manuteno no cdigo. **/ Para comentrios de uma linha somente, o comentrio deve ser uma espcie de marcador de loops ou no deve ser aplicado. A questo que como exposto em linhas anteriores, os comentrios devem chamar a ateno visando facilitar e direcionar a manuteno. Somente justifica-se um comentrio de uma linha quando voc necessita marcar dentro de um bloco de cdigo o incio de um nvel de endentao ou loop. Por exemplo: //Verifica se somente uma string foi entrada if (args.Length == 1) Console.WriteLine(args[0]); else { ArgumentOutOfRangeException ex; ex = new ArgumentOutOfRangeException("Somente string"); throw (ex); }

Microsoft Visual C# Outra boa aplicao para comentrios de uma linha a explicao de uma declarao. Por exemplo: int nivelStatus; //nvel do status int tamanhoStatus; //tamanho do status g. Comentrios de classes e mtodos Toda classe e mtodo devem ser documentados. O padro utilizado segue abaixo: ///<summary> ///Retorna DirectoryEntry representando a unidade organizacional. ///</summary> ///<param name=coopCentral>Cooperativa Central.</param> ///<param name=cooperativa>Cooperativa Desejada.</param> ///<returns> ///Resultado da busca no Active Directory. ///</returns> ///exception cref=ActiveDirectoryManager.ActiveDirectoryManagerException> ///Se no for encontrada a uniudade organizacional. ///</exception> ///<remarks> ///criado por: <nome> ///alterado por: <nome> ///</remarks> h. Declaraes Variveis privadas de classe Utilizar a definio CamelCase (a primeira letra do identificador minscula e a primeira letra de cada identificador subseqente concatenado maiscula). Exemplo: String primeiroNome; Variveis locais Utilizar a definio CamelCase. Namespace Utiliza-se o nome da empresa seguido pelo nome do projeto, camada de negocio e o modulo que est sendo desenvolvido. Exemplo: namespace ItTrainig.NomeProjeto.CamadaNegocio.AccessControl {

10

Microsoft Visual C# Interface O nome de interface deve ser PascalCase (a primeira letra do identificador maiscula e a primeira letra de cada identificador subseqente concatenado maiscula), e comear com o prefixo I, para indicar que o tipo uma interface. Exemplo: IServiceProvider Mtodos Utilizar a definio PascalCase. Enumeraes Utilizar a definio PascalCase. Eventos Utilizar a definio PascalCase para o nome do evento. Delegates Utilizar o sufixo EventHandler para o nome do delegate associado ao evento. Especificar dois parmetros sender e e. O parmetro sender representa o objeto que disparou o evento e deve ser sempre do tipo Object, mesmo sendo possvel utilizar um tipo especifico. O estado associado com o evento encapsulado em uma instancia de um evento de classe chamado e. Exemplos: public delegate void MouseEventHandler(object sender,MouseEventArgs e) public event MouseEventHandlerClick; Constantes Nomes de constantes devero ser todos maisculos com as palavras separadas por um underscore. Exemplo: A2A_MAX Excees O nome de uma classe de exceo deve utilizar a definio PascalCase, e finalizar com a expresso Exception, para indicar que o tipo uma exceo. Exemplo: ServiceProviderException

11

Microsoft Visual C# Propriedades pblicas Utilizar a definio PascalCase para o nome de propriedades. Exemplo: public int PrinterStatus { } Windows Forms Abaixo temos a lista de componentes e os prefixos:
Componente Button Char CheckBox CheckedListBox ColorDialog ComboBox ContextMenu CrystalReportViewer DataGrid DomainUpDown ErrorProvider FontDialog Form GroupBox HelpProvider HScrollBar ImageList Label LinkLabel ListBox ListView RadioButton TreeView VScrollBar Prefixo btn ch chk clb cld cbo cmn rpt grd upd err ftd frm grp hlp hsb ils lbl lnk lst lvw rad tre vsb Exemplo btnExit chxxx chkReadOnly clbOptions cldText cboEnglish cmnOpen rptSales grdQueryResult updPages errOpen ftdText frmEntry grpActions hlpOptions hsbMove ilsAllIcons lblHelpMessage lnkEmail lstPolicyCodes lvwHeadings radType treOrganization vsbMove

12

Microsoft Visual C# Objeto de dados Abaixo temos alguns componentes de comunicao de dados:

Variveis Veja a lista abaixo de tipos e prefixos:

13

Microsoft Visual C# Web Forms Veja a lista abaixo de tipos e prefixos:


Tipo AdRotator Button Calendar CheckBox CheckBoxList CompareValidator CrystalReportViewer DataGrid DataList DropDownList HyperLink Image ImageButton Label LinkButton ListBox Literal Panel PlaceHolder RadioButton RadioButtonList RangeValidator RegularExpressionValidator Repeater Table TextBox Xml Prefixo adrtr btn cldr cbx cbxl cvdr crvwr dgrd dlst ddl hlnk img ibtn lbl lbtn lbx ltrl pnl phdr rbtn rbtnl rvdr rev rptr tbl tbx xml

14

Microsoft Visual C# Consideraes Ao declarar variveis, procure seguir as consideraes abaixo. Ao invs de: int a, b;usar: int a; //Valor de entrada 1 int b; //Valor de entrada 2 Sempre inicializar suas variveis no local aonde so declaradas. int a = 1; //Valor de entrada 1 i. Criando um Projeto de Aplicao para Windows Antes de iniciarmos um projeto, existe um ponto que deve ser vistos para maior entendimento da estrutura da aplicao. Namespace: O Namespace uma forma organizacional de agrupamento lgico,

permitindo que atravs de um nome totalmente qualificado voc possa identificar unicamente um recurso. Voc pode colocar o namespace que achar necessrio, a seu gosto. O principal namespace do Visual Studio 2008 o System. Para referenci-lo em seu projeto, basta colocar no inicio da pgina a seguinte codificao: using System; //Referenciando namespace System O Visual Studio. NET conta com diversos recursos importantes para o desenvolvimento de aplicaes Windows. Abaixo os passos para criar sua primeira aplicao .NET Entre no Visual Studio.NET 2008. Crie um novo projeto do tipo Windows Application, informe a pasta de trabalho: [C:\ITTraining\TurmaXX\WinHello] onde XX o nmero da sua turma com o nome de WinHello.

15

Microsoft Visual C#

O Visual Studio .NET 2008 cria e mostra um formulrio baseado em Windows no modo Design conforme figura.

Vamos agora criar a nossa interface com o usurio.

16

Microsoft Visual C# Na barra de ferramentas do Visual Studio .NET 2008, selecione no ToolBox o controle Label e arraste para o formulrio criado a label, posicione-o no canto superior esquerdo do formulrio. Conforme vimos anteriormente, altere seu nome para melhor identificao. No exemplo ser usado o nome lblMensagem.

Para colocar um controle no formulrio voc pode tambm dar um clique duplo sobre ele na barra de ferramentas ou clicar uma vez sobre ele na barra de ferramentas e depois clicar no formulrio. O clique duplo posiciona o controle no canto superior esquerdo. A segunda opo coloca o controle no local onde voc clicar. Coloque tambm no formulrio um controle TextBox e um controle Button. Como mostra a figura abaixo e altere seus respectivos nomes. No exemplo ser usado o nome txtMensagem e btnMensagem.

17

Microsoft Visual C#

Na janela Solution Explorer, clique no boto View Code. O cdigo do arquivo Form1.cs aparece. Para voltar ao modo design, tambm na janela Solution Explorer clique em View Design. Form1.cs tem todo o cdigo gerado automaticamente pelo Visual Studio .NET 2008. Note os seguintes elementos no cdigo. As diretivas usadas no inicio do cdigo referenciando aos namespaces. using using using using using using using using System; System.Collections.Generic; System.ComponentModel; System.Data; System.Drawing; System.Linq; System.Text; System.Windows.Forms;

18

Microsoft Visual C# O Visual Studio .NET 2008 usa o mesmo nome do projeto para criar o namespace principal. namespace WinHello { ... } Uma classe chamada Form1 dentro do namespace WinHello. namespace WinHello { public partial class Form1 : Form { ... } } O constructor (construtor), um mtodo especial que tem o mesmo nome da classe. Ele o primeiro mtodo a ser executado quando o programa iniciado. namespace WinHello { public partial class Form1 : Form { public Form1() { ... } } } Repare que foi criado dentro da classe Form1 uma chamada a um mtodo InitializeComponent();que responsvel pela inicializao dos controles. namespace WinHello { public partial class Form1 : Form { public Form1() { InitializeComponent(); } } } Um mtodo chamado InitializeComponent. O cdigo dentro deste mtodo configura as propriedades dos controles que adicionamos no modo Design. Ateno, no modifique o contedo do InitializeComponent diretamente no cdigo, use a janela Properties no modo Design. #region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.lblMensagem = new System.Windows.Forms.Label(); this.txtMensagem = new System.Windows.Forms.TextBox(); this.btnMensagem = new System.Windows.Forms.Button(); this.SuspendLayout(); // // lblMensagem // this.lblMensagem.AutoSize = true; this.lblMensagem.Location = new System.Drawing.Point(13, 13); this.lblMensagem.Name = "lblMensagem"; this.lblMensagem.Size = new System.Drawing.Size(159, 13);

19

Microsoft Visual C# this.lblMensagem.TabIndex = 0; this.lblMensagem.Text = "[Aqui aparecer sua mensagem]"; // // txtMensagem // this.txtMensagem.Location = new System.Drawing.Point(16, 47); this.txtMensagem.Name = "txtMensagem"; this.txtMensagem.Size = new System.Drawing.Size(100, 20); this.txtMensagem.TabIndex = 1; // // btnMensagem // this.btnMensagem.Location = new System.Drawing.Point(122, 47); this.btnMensagem.Name = "btnMensagem"; this.btnMensagem.Size = new System.Drawing.Size(123, 23); this.btnMensagem.TabIndex = 2; this.btnMensagem.Text = "Mostrar Texto"; this.btnMensagem.UseVisualStyleBackColor = true; // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(292, 273); this.Controls.Add(this.btnMensagem); this.Controls.Add(this.txtMensagem); this.Controls.Add(this.lblMensagem); this.Name = "Form1"; this.Text = "Form1"; this.ResumeLayout(false); this.PerformLayout(); } #endregion Volte para o modo Design. Para voltar ao modo design, tambm na janela Solution Explorer clique em View Design. De um clique sobre o btnMensagem para selecion-lo. Na janela Properties, altere a propriedade Text do btnMensagem para Mostrar Texto. Se no localizar a janela Properties, clique em F4, ou no menu View, clique em Properties Window. Altere tambm a propriedate Text do lblMensagem para Digite o seu nome Altere agora a propriedade Text do controle txtMensagem para aqui. Note que as propriedades modificadas na janela Properties ficam em negrito. Assim voc pode saber se elas esto com seu valor padro ou no. Mude para o painel de cdigo. Note que as propriedades que voc modificou esto no mtodo

InitializeComponent. Conforme mostra o cdigo abaixo:

20

Microsoft Visual C# #region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.lblMensagem = new System.Windows.Forms.Label(); this.txtMensagem = new System.Windows.Forms.TextBox(); this.btnMensagem = new System.Windows.Forms.Button(); this.SuspendLayout(); // // lblMensagem // this.lblMensagem.AutoSize = true; this.lblMensagem.Location = new System.Drawing.Point(13, 13); this.lblMensagem.Name = "lblMensagem"; this.lblMensagem.Size = new System.Drawing.Size(83, 13); this.lblMensagem.TabIndex = 0; this.lblMensagem.Text = "Digite seu nome"; // // txtMensagem // this.txtMensagem.Location = new System.Drawing.Point(16, 47); this.txtMensagem.Name = "txtMensagem"; this.txtMensagem.Size = new System.Drawing.Size(100, 20); this.txtMensagem.TabIndex = 1; this.txtMensagem.Text = "Aqui"; // // btnMensagem // this.btnMensagem.Location = new System.Drawing.Point(122, 47); this.btnMensagem.Name = "btnMensagem"; this.btnMensagem.Size = new System.Drawing.Size(123, 23); this.btnMensagem.TabIndex = 2; this.btnMensagem.Text = "Mostrar Texto"; this.btnMensagem.UseVisualStyleBackColor = true; // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(292, 273); this.Controls.Add(this.btnMensagem); this.Controls.Add(this.txtMensagem); this.Controls.Add(this.lblMensagem); this.Name = "Form1"; this.Text = "Form1"; this.ResumeLayout(false); this.PerformLayout(); } #endregion Volte para o modo Design. Selecione o formulrio. Clicando sobre ele. Note que aparecem trs marcadores. Eles ajudam a redimensionar o formulrio.

21

Microsoft Visual C# Clique sobre o marcador central na parte de baixo do Form1 e mantendo o boto pressionado arraste para cima. Isso serve para os outros controles tambm, clique sobre os outros controles e note os marcadores. No painel de cdigo de um clique duplo sobre o btnMensagem. Note que ele vai diretamente para o painel de cdigo e criado automaticamente o seguinte cdigo. private void btnMensagem_Click(object sender, EventArgs e) { } Tudo que for digitado dentro deste cdigo ser executado assim que o Button1 for clicado quando o programa estiver executando. Digite o seguinte cdigo: Tenha ateno com esse cdigo, ele deve ser digitado exatamente como se segue, lembre-se que o C# case-sensitive, ou seja, a palavra ITTraining diferente de ittraining. importante lembrar do ponto-e-virgula no final da linha. private void btnMensagem_Click(object sender, EventArgs e) { MessageBox.Show("Ola " + txtMensagem.Text); } Execute o programa. Para executar o programa voc pode clicar e Ctrl+F5, ou no menu Debug clicar em Start Without Debugging. Automaticamente o Visual Studio .NET salva o programa, compila e o executa. A seguinte janela aparece:

Digite seu nome e clique em Mostrar Texto. Uma janela aparece exibindo a mensagem Ola [seu-nome]. Clique em Ok para fechar a janela com a mensagem. Na janela executando o Form1 clique em fechar.

22

Microsoft Visual C# Agora voc j esta familiarizado com as ferramentas do Visual Studio.NET 2008. 2. Entendendo os fundamentos da linguagem C# a. Fundamentos O objetivo do trabalho efetuar uma introduo aos principais aspectos da linguagem C#, incluindo os tipos de dados intrnsecos (valor e referencia), estruturas de interao e de deciso, o papel do system.Object as tcnicas bsicas de construo de classes. Para a ilustrao destes fundamentos da linguagem, vamos olhar para as bibliotecas .NET base e construir um nmero de aplicaes exemplos utilizando vrios espaos de nome .NET Como a linguagem Java, C# manda que todas as instrues de programa devam ser inseridas no interior de uma definio de type, normalmente uma classe. O espao de nome System contm as classes base e fundamentais que define os tipos por valor ou referencia mais usados. Outras classes suportam servios de converso de tipos de dados e manipulao de paramentos dos mtodos. Os mtodos podem ser do tipo pblico ou estticos, e devem ser entendidos que os pblicos podem ser acessados de outras classes enquanto que os estticos apenas podem ser acessados dentro do nvel da classe em que so definidos sem necessidade de criar um novo objeto. medida que estamos desenvolvendo nossos cdigos, percebemos que estes podem ser divididos de acordo com suas funcionalidades. Ao efetuar esta diviso, estamos na verdade criando blocos de cdigos que executam uma determinada tarefa. E, descobrimos que tais blocos de cdigos podem ser reaproveitados com freqncia em um mesmo programa. Assim, ao mecanismo usado para disparar a execuo destes blocos de cdigos dado o nome de mtodo (ou funo em linguagens tais como C e C++). Um mtodo, em sua forma mais simples, apenas um conjunto de instrues que podem ser chamadas a partir de locais estratgicos de um programa. Veja um exemplo: // um mtodo que no recebe nenhum argumento // e no retorna nenhum valor static void metodo() { Console.WriteLine("Sou um mtodo"); }

23

Microsoft Visual C# Este mtodo apenas exibe o texto "Sou um mtodo". Veja o uso das chaves { e } para delimitar a rea de atuao do mtodo (o corpo do mtodo). A palavrachave void indica que este mtodo no retorna nenhum valor ao finalizar sua execuo. Todos os mtodos em C# possuem parnteses, os quais servem como marcadores para a lista de parmetros do mtodo. Parnteses vazios indicam que o mtodo no possui parmetros. Veja agora um trecho de cdigo completo exemplificando a chamada ao mtodo recm-criado: // um mtodo que no recebe nenhum argumento // e no retorna nenhum valor static void metodo() { Console.WriteLine("Sou um mtodo"); } static void Main(string[] args) { // efetua uma chamada ao mtodo metodo(); Console.WriteLine("\n\nPressione uma tecla para sair..."); Console.ReadKey(); } b. Usando tipos predefinidos no C# Segue abaixo uma lista sobre os tipos predefinidos no C#
Tipo byte char bool sbyte short ushort int uint float double decimal long ulong Tamanho (em bytes) 1 1 1 1 2 2 4 4 4 8 8 8 8 Tipos .NET Byte Char Boolean Sbyte Int16 Uint16 Int32 Uint32 Single Double Decimal Int64 Uint64

24

Microsoft Visual C# Exemplos de declarao: byte bytVar1 = 0; char chrVar2 = ""; bool blnVar3 = false; sbyte sbytVar4 = 0; short shtVar5 = 0; ushort yshtVar6 = 0; int intVar7 = 0; uint uintVar8 = 0; float fltVar9 = 0; double dblVar10 = 0; decimal dcmVar11 = 0; ulong ulngVar13 = 0; Escrevendo expresses chrVar2 = "a" + "b"; intVar7 += 1; dblVar10 = (fltVar9 * intVar7) / dcmVar11; Criando estruturas condicionais Estruturas condicionais so comuns e necessrias em todos os programas. A declarao if...else est entre as mais utilizadas pelos desenvolvedores. Algumas delas pouco conhecidas dos novos programadores e mais familiares para quem j utilizava a linguagem C#. IF...ELSE com expresses simples A declarao condicional if...else pode ser escrita de diferentes formas, especialmente quando estamos construindo uma expresso simples, onde uma nica ao executada caso a expresso seja verdadeira. Todos os exemplos apresentados no quadro abaixo so vlidos. // considere as variveis X e Y int x = 0; int y = 5; // declarao IF em uma nica linha if (x > y) return; // declarao IF...ELSE em duas linhas if (x > y) MessageBox.Show("X > Y"); else MessageBox.Show("X < Y"); // declarao IF...ELSE com quebra de linha if (x > y) MessageBox.Show("X > Y"); else MessageBox.Show("X < Y"); // declarao IF...ELSE em uma nica linha if (x > y) MessageBox.Show("X>Y"); else MessageBox.Show("X<Y"); // utilizao dos delimitadores de bloco neste caso // apesar de vlido desnecessrio. if (x > y) { MessageBox.Show("X > Y"); } else { MessageBox.Show("X < Y"); }

25

Microsoft Visual C# c. Os delimitadores de bloco { } Quando precisamos executar mais de uma ao aps avaliar a expresso condicional, ento faz-se necessrio a utilizao dos delimitadores de bloco, que tem a funo de agrupar um conjunto de instrues ou linhas de comando. Veja o exemplo no quadro abaixo. utilizao dos delimitadores de bloco neste caso necessria para que vrias aes sejam executadas caso a expresso seja satisfeita. (x > y) { MessageBox.Show("X > Y"); this.Text = "Expresso verdadeira."; this.AtivarControles(); } else { MessageBox.Show("X < Y"); this.Text = "Expresso falsa."; this.DesativarControles(); } d. Outras declaraes condicionais O C# oferece outra opo para construo de declaraes condicionais. Os operadores ?: representam uma boa alternativa para quem j estava habituado com a linguagem C#. Podemos at fazer uma comparao grosseira da sintaxe utilizadas com esses operadores com a funo IIF no VB ou VBA. A sintaxe utilizada <expresso> ? <verdadeira> : <falsa>. Veja os exemplos no quadro abaixo: int x = 1; int y = 2; int z = 3; // definindo a mesagem de acordo com a expresso MessageBox.Show(x > y ? "X > Y" : "X < Y"); // atribui valor para z de acordo com a expresso z = x > y ? x * z : y * z; MessageBox.Show(z.ToString()); // expresses condicionais aninhadas // z = <expr1> ? <true> : <expr2> ? <true> : <false> z = x > y && x == 1 ? x * z : y > 1 ? y * z : y * z + x; MessageBox.Show(z.ToString()); Numa primeira impresso, esse tipo de construo pode parecer confuso, contudo se o desenvolvedor analisar esta sintaxe, ver que os operadores ?: podem ser muito teis e prticos em diversos cenrios de codificao. Expresses simples ou aninhadas podem ser facilmente construdas com os operadores ?:. Com certeza voc j implementou diversas expresses condicionais e todas funcionam muito bem. importante que os principiantes na linguagem C# entendam a sintaxe correta das diferentes formas de declaraes condicionais. Muitos programadores, mesmo experientes, no conhecem ou no tem o hbito de utilizar os operadores ?: que podem facilitar a codificao de expresses // // // if

26

Microsoft Visual C# condicionais simples ou aninhadas. Explore as dicas acima e aprimore suas expresses condicionais. e. Comandos C# C# possui um grupo variado de comandos de controle de fluxo do programa que definiro sua lgica de processamento. A forma com que os comandos so tratados permanece similar s anteriores. Portanto, na programao sequncial, na programao estruturada ou programao orientada objetos, cada comando executado igualmente, ou seja, instruo por instruo. Na verdade, esta a lei do processador. Os principais comandos so classificados em: Declarao Rtulo ou Label Desvio ou Jump Seleo Iterao ou Loop A maioria destes comandos familiar para os programadores de linguagens como C ou C++. Estes comandos podem ser encontrados dentro de um bloco ou na forma isolada. O bloco de comandos representado por chaves ({}). Normalmente, um bloco de comando tratado como uma unidade de comando e utilizado com instrues como if, for, while, try, entre outros. //Comando isolado if (a == true) System.Console.Write("Verdadeiro"); //Bloco { int int int } de comandos x = 100; y = 200; z = x + y;

Uma linha de comando em C# pode conter uma ou mais instrues. Todas elas so terminadas pelo finalizador (end point) ponto e vrgula (;). //Vrios comandos em uma nica linha while (a <= 100) if (b == true) a++; Um tipo de comando conhecido como vazio (empty) tambm vlido em C#. //Loop infinito sem comando ou comando vazio for (; ; ) ; //Loop infinito com comando. ltimo ponto e vrgula representa o finalizador

27

Microsoft Visual C# for (; ; ) System.Console.Write("C# legal"); Declarao Indica um recurso a ser utilizado ou exposto. As declaraes podem ser de variveis, constantes, funes (mtodos), propriedades ou campos. Para declarar uma varivel basta especificar o tipo seguido de uma literal. A definio de uma constante ocorre da mesma forma que a varivel, porm prefixada a a palavra-chave const e obrigatoriamente sufixada com o sinal de igual (=) e seu valor. A atribuio para uma varivel pode ocorrer a qualquer momento dentro da aplicao ou na sua definio inicial, no entanto, para uma constante, somente a atribuio inicial vlida e permanecer inalterada durante a execuo. Uma varivel ou constante dependente de escopo, ou seja, da visibilidade dentro de uma aplicao. Por exemplo, a varivel x abaixo no pode ser utilizada diretamente fora da funo Main. Neste caso, ela deve ser utilizada atravs de um argumento de uma funo ou outra varivel com escopo mais elevado. Os principais escopos so local e classe. Todas as variveis ou constantes dentro do escopo de classe podem, obviamente, ser utilizadas dentro da classe como um todo. Para no alargarmos a discusso, no citarei, neste momento, detalhes de orientao objetos tais como propriedades, mtodos, campos e visibilidades internas e externas (public, private, internal ou protected). O exemplo abaixo ilustra os casos mais usuais de declarao: using System; class Declares { private static int f = 1000, g; //Variveis de escopo de classe private const int m = 1000, n = 10000; //Constantes de escopo de classe public static void Main() { //Constantes de escopo local const int x = 10; const long y = 100; //Variveis de escopo local int a = 10; long b; b = 100; g = 10000; printf(x, y, a, b); } //Funo

28

Microsoft Visual C# private static void printf(int ix, long ly, int ia, long lb) { Console.WriteLine("Locais\nconstantes: x={0} y={1} vriaveis: a={2} b={3}", ix, ly, ia, lb); Console.WriteLine("Classe\nconstantes: m={0} n={1} vriaveis: f={2} g={3}", m, n, f, g); } } Para compilar o exemplo acima, no prompt, digite csc Declares.cs. Execute o programa digitando Declares. A Figura 1, mostra compilao e execuo da aplicao em C#.

Figura 1: Compilao e Execuo do exemplo Declares As declaraes de variveis ou constantes de mesmo tipo podem ser feitas na mesma linha. int x; int y; int z = 10; Pode ser o mesmo que: int x, y, z = 10; Sobre escopo de variveis e constantes um escopo interno tem prioridade sobre o escopo externo, para qualquer resoluo sempre o interno ser utilizado. Variveis ou constantes dentro do mesmo escopo no podero possuir o mesmo nome, pois o compilador tratar isto como um conflito. Porm, elas podero ser encontradas com o mesmo nome em escopos ou locais diferentes. O conflito de nomes tambm deve ser considerado para funes (mtodos), propriedades e campos. class MyClass{

29

Microsoft Visual C#

private int x = 10; private int MyFunction(){ int x = 100; System.Console.Write(x); //Exibe o valor 100 } private int MyFunction2(){ System.Console.Write(x); //Exibe o valor 10 } } Rtulo (Label) Discutir sobre rtulos (labels) sem falar sobre comandos de desvio impossvel. Mas a nica funo de um rtulo marcar, com uma palavra no reservada, uma rea do cdigo que pode ser saltada atravs do comando goto. Mesmo que C# permitida, este tipo de prtica no aconselhvel em linguagens de alto ou mdio nvel desde a evoluo da programao sequencial. using System; class Jumps{ public static void Main(){ bool a = true; goto mylabel; //Este comando no ser executado if (a == true){ Console.Write("Verdadeiro"); goto end; } mylabel: Console.Write("Falso"); //o label sempre seguido por um comando, neste caso um comando vazio end: ; } } Desvio (Jump) Os comandos de desvio em C# so: break, continue, goto, return e throw. Basicamente, sua funcionalidade desviar a execuo do cdigo para uma outra localizao. Adorado por alguns e odiado pela maioria dos programadores e

especialistas, a instruo goto no foi abolidada da linguagem C#, tendo papel fundamental quando aplicada com o comando switch, que veremos mais adiante. O comando goto simplesmente executa um desvio de cdigo atravs de um rtulo.

30

Microsoft Visual C# Este desvio pode ser top-down (de cima para baixo) ou bottom-up (de baixo para cima). //Loop infinito endless: goto endless; O comando return utilizado para devolver um valor e sair de uma funo ou mtodo chamado. Neste caso, o processamento retornado para o chamador para a continuao do processamento. Em caso de funes que no retornam valor (void), o comando return poder ser encontrado isolado, ou omitido se o mesmo dever ser encontrado no fim da funo. Os snippets abaixo exibem os casos mais comuns: long z = Sum(10,20); //continuao do programa... private static long Sum(int x, int y){ //Soma os valores e retorna um long return x+y; } private static bool boolFromint(int a){ //Verifica se o valor do inteiro 0 e retorna false, seno retorna true if(a==0) return false; else return true; } private static void printf(string s){ //Imprime a string e retorna logo em seguida, clusula return omitida System.Console.Write(s); } O comando throw utilizado para produzir uma exceo, e pode ser interceptado em tempo de execuo pelo bloco try/catch. private static double Division(int x, int y){ //Se o divisor for zero disparar a excesso da BCL DivideByZeroException if(y==0) throw new DivideByZeroException(); return x/y; } Os comandos break e continue so utilizados com os comandos de iterao switch, while, do, for ou foreach. O comando break interrompe a execuo do bloco

31

Microsoft Visual C# destes comandos passando para prxima instruo ou bloco de execuo. O comando continue, ao contrrio do break, passa para a verificao destes comandos. int b=0; for(int a = 0; a < 100; ++a){ //Loop infinito while(true){ if (++b==100) break; //Se b igual a 100, o break fora a sada do loop while } b=0; continue; //Passa para prxima iterao do comando for System.Console.Write("a={0} b={1}",a,b); //Esta linha no executada } //Continuao aps o bloco for... Seleo Os comandos de seleo so utilizados na escolha de uma possibilidade entre uma ou mais possveis. Os comandos if e switch fazem parte deste grupo. Comando if O comando if utiliza uma expresso, ou expresses, booleana para executar um comando ou um bloco de comandos. A clusula else opcional na utilizao do if, no entanto, seu uso comum em decises com duas ou mais opes. //if com uma nica possibilidade. Exibe a string "Verdadeiro" no Console caso a //expresso (a==true) seja verdadeira if(a==true) System.Console.Write("Verdadeiro"); //if com uma nica possibilidade. Exibe a string "Verdadeiro" no Console caso a //expresso (a==true) seja verdadeira, seno exibe a string "Falso" if(a==true) System.Console.Write("Verdadeiro"); else System.Console.Write("Falso"); Toda expresso do comando if deve ser embutida em parnteses (()) e possui o conceito de curto-circuito (short-circuit). Isto quer dizer que se uma expresso composta por And (&&), fornecer na sua primeira anlise um valor booleano false (falso), as restantes no sero analisadas. Este conceito vlido para todas expresses booleanas. Por exemplo: //&& (And). Somente a primeira funo executada if(MyFunc() && MyFunc2()); //|| (Or). Ambas funes so executadas prxima iterao e

32

Microsoft Visual C# if(MyFunc() || MyFunc2()); public static bool MyFunc(){ return false; } public static bool MyFunc2(){ return true; } Assim como outros comandos. O if tambm pode ser encontrado na forma aninhada. if(x==1) if(y==100) if(z==1000) System.Console.Write("OK"); Porm, devido a caracterstica de curto-circuito nas expresses, as linhas de cima podem e devem ser reescritas para: if(x==1 && y==100 && z==1000) System.Console.Write("OK"); O comando if tambm pode ser encontrado num formato escada if-else-if, quando existem mais do que duas possibilidades. Porm, na maioria destes casos, se as expresses no forem compostas ou utilizarem de funes, a clusula switch substitui este tipo de construo. using System; class Ifs{ public static void Main(){ char chOpt; Console.WriteLine("1-Inserir"); Console.WriteLine("2-Atualizar"); Console.WriteLine("3-Apagar"); Console.WriteLine("4-Procurar"); Console.Write("Escolha entre [1] a [4]:"); //Verifica se os valores entrados esta entre 1 e 4 //caso contrrio pede reentrada do{ chOpt = (char)Console.Read(); }while(chOpt<'1' || chOpt>'4'); if(chOpt=='1'){ Console.WriteLine("Inserir..."); //InsertFunction(); } else if(chOpt=='2'){ Console.WriteLine("Atualizar..."); //UpdateFunction(); } else if(chOpt=='3'){ Console.WriteLine("Apagar...");

33

Microsoft Visual C# //DeleteFunction(); } else{ Console.WriteLine("Procurar..."); //FindFunction(); } } O comando if com a clusula else nica pode ser encontrado em sua forma reduzida com operador ternrio representado por interrogao (?:). chamado de operador ternrio por possuir 3 expresses: a primeira refere-se a condio boolena, a segunda se a condio verdadeira e a terceira se a condio falsa. int x; if(f==true) x = 100; else x = 1000; As linhas acima podem ser substitudas por: int x = f==true?100:1000; Comando switch O comando switch utiliza o valor de uma determina expresso contra uma lista de valores constantes para execuo de um ou mais comandos. Os valor constante tratado atravs da clusula case e este pode ser nmerico, caracter ou string. A clusula default utilizada para qualquer caso no interceptado pelo case. O exemplo abaixo implementa a verso com o comando switch do exemplo, previamente mostrado com o comando if: using System; class Switchs{ public static void Main(){ char chOpt; Console.WriteLine("1-Inserir"); Console.WriteLine("2-Atualizar"); Console.WriteLine("3-Apagar"); Console.WriteLine("4-Procurar"); Console.Write("Escolha entre [1] a [4]:"); //Verifica se os valores entrados esta entre 1 e 4 //caso contrrio pede reentrada do{ chOpt = (char)Console.Read(); }while(chOpt<'1' || chOpt>'4'); switch(chOpt){

34

Microsoft Visual C# case '1': Console.WriteLine("Inserir..."); //InsertFunction(); break; case '2': Console.WriteLine("Atualizar..."); //UpdateFunction(); break; case '3': Console.WriteLine("Apagar..."); //DeleteFunction(); break; default: Console.WriteLine("Procurar..."); //FindFunction(); } } Para compilar o exemplo acima, no prompt, digite csc Switchs.cs. Execute o programa digitando Switchs. A Figura 2, mostra compilao e execuo da aplicao em C#.

Figura 2: Compilao e Execuo do exemplo Switchs No entanto, o comando switch no herda as caractersticas do mesmo em C ou C++, uma clusula case fora um comando de desvio como break, goto ou return assim as outras clusulas case no sero processadas, o break em C# no causa o efeito fall through. Se o programa precisar tratar mais do que uma

clusula case com cdigos distintos no mesmo switch, o comando goto dever ser utilizado. Uma ou mais clusulas case podem ser encontradas seguidamente quando mais do que uma opo permitida para um comando ou bloco de comandos. O exemplo abaixo apresenta essa condio: switch(sProduct){ case Windows 2000: case Windows NT: System.Console.Write(Sistema Operacional); break;

35

Microsoft Visual C# case MSDE: System.Console.Write(Mecanismo Simplificado); goto case SQL Server; case SQL Server: System.Console.Write(Banco de Dados); } Assim como o comando if possvel encontrar o comando switch em sua forma aninhada. switch(x){ case 10: switch(y){ case 100: case 1000: } break; case 100: break; } Iterao ou Loop Conhecidos como lao ou loop, os comandos de iterao executam repetidamente um comando ou bloco de comandos, a partir de uma determinada condio. Esta condio pode ser pr-definida ou com final em aberto. Em C#, fazem parte dos comandos de iterao: while, do, for e foreach. Comando for O comando for possui 3 declaraes opcionais, separadas por ponto e vrgula (;), dentro dos parnteses: inicializao, condio e a iterao. Em cada parmetro, mais de uma expresso pode ser encontrada separada por vrgula. for(int x=0; x < 100; ++x) System.Console.WriteLine(x); for(;;) System.Console.WriteLine(Hello, World!); for(int y=100, int x = 0; x < y; ++x, --y)

System.Console.WriteLine(y); Quando a clusula for processada pela primeira vez, se presente, a expresso ou expresses da declarao inicializadora so executadas na ordem que elas esto escritas, este passo ocorre apenas uma vez. Se a declarao condicional estiver presente, ser avaliada, caso contrrio o for assume o valor verdadeiro (true). Na avaliao, se o valor obtido for verdadeiro (true) o comando ou bloco de comandos associados sero executados, ao seu final a terceira declarao ou declarao de iterao processada e, ento, novamente a declarao condicional processada. Este fluxo ocorre continuamente at que a declarao condicional

36

Microsoft Visual C# seja avaliada como falsa (false) ou o comando break seja encontrado, como visto anteriormente. O comando continue fora uma nova iterao. using System; class Fibonacci{ public static void Main(){ int iVezes; Console.Write("Entre de 1 a 100 para o n de elementos a exibir na sequncia de Fibonacci:"); //Verifica se os valores entrados esta entre 1 e 100 //caso contrrio pede reentrada do{ iVezes = Console.ReadLine().ToInt32(); } while (iVezes < 1 || iVezes > 100); //Cria o vetor dinmicamente int[] iSeq = new int[iVezes]; iSeq[0] = 1; //Preenche o vetor if (iVezes > 1){ iSeq[1] = 1; for (int a = 2; a < iVezes; ++a) iSeq[a] = iSeq[a - 1] + iSeq[a - 2]; } //Exibe o vetor for (int a = 0; a < iVezes; ++a){ Console.Write(iSeq[a]); Console.Write(" "); } } } Para compilar o exemplo acima, no prompt, digite csc Fibonacci.cs. Execute o programa digitando Fibonacci. A Figura 3, mostra compilao e execuo da aplicao em C#.

37

Microsoft Visual C#

Figura 3: Compilao e Execuo do exemplo Fibonacci Comando foreach O comando foreach enumera os elementos de uma coleo. O cdigo abaixo implementa a funcionalidade do exemplo anterior: using System; class Fibonacci{ public static void Main(){ int iVezes; Console.Write("Entre de 1 a 100 para o n de elementos a exibir na sequncia de Fibonacci:"); //Verifica se os valores entrados esta entre 1 e 100 //caso contrrio pede reentrada do{ iVezes = Console.ReadLine().ToInt32(); } while (iVezes < 1 || iVezes > 100); //Cria o vetor dinmicamente int[] iSeq = new int[iVezes]; iSeq[0] = 1; //Preenche o vetor if (iVezes > 1){ iSeq[1] = 1; for (int a = 2; a < iVezes; ++a) iSeq[a] = iSeq[a - 1] + iSeq[a - 2]; } //Exibe o vetor foreach (int a in iSeq){ Console.Write(a); Console.Write(" "); } } }

38

Microsoft Visual C# Os vetores em C# herdam da classe System.Array do .NET Framework e implementam a interface IEnumerable que possui o mtodo GetEnumerator que retorna a interface IEnumerator que possui 3 membros: a propriedade Current que retorna o objeto atual, o mtodo MoveNext que pula para o prximo elemento e o mtodo Reset que reinicializa o posicionamento do elemento atual. Qualquer interface ou classe que implemente IEnumerable e IEnumerator pode utilizar o comando for each. O comando foreach compacta a sequncia abaixo: System.Collections.IEnumerator ienumSeq = iSeq.GetEnumerator(); while(ienumSeq.MoveNext()){ System.Console.WriteLine(ienumSeq.Current); } foreach(int a in iSeq){ System.Console.WriteLine(a); } Comandos do while Os comandos do e while tm caractersticas semelhantes. Ambos executam condicionalmente um comando ou bloco de comandos. No entanto, o comando do pode ser executado uma ou mais vezes e o comando while pode ser executado nenhuma ou mais vezes, isto ocorre porque a expresso condicional do comando do encontrada no final do bloco. int a = 0; bool f = true; while(f){ if(++a==100) f = true; System.Console.WriteLine(a); } int a = 0; bool f = true; do{ if(++a==100) f = true; System.Console.WriteLine(a); } while(f);

39

Microsoft Visual C# Assim como para os comandos for e foreach, as clusulas break e continue podem ser utilizadas para interferir no fluxo de execuo. Outros comandos Outros comandos, com finalidades distintas e no agrupados nos itens citados anteriormente, so: try, catch, finally, checked, unchecked, unsafe, fixed e lock. Os comandos try, catch e finally so utilizados na intercepo e tratamento de exceo em tempo de execuo. using System; class try_catch_finally{ public static void Main(){ try{ Console.WriteLine("Bloco try"); throw new NullReferenceException(); }catch (DivideByZeroException e){ Console.WriteLine("Bloco catch #1. Mensagem: {0}", e.Message); }catch (NullReferenceException e){ Console.WriteLine("Bloco catch #2. Mensagem: {0}", e.Message); }catch (Exception e){ Console.WriteLine("Bloco catch #3. Mensagem: {0}", e.Message); }finally{ Console.WriteLine("Bloco finally"); } } } Os comandos checked e unchecked, tratam de overflow aritmtico. O comando checked dispara a exceo OverflowException e o comando unchecked trunca o valor. O parmetro /checked+ do compilador trata o overflow como checked e o parmetro /checked- do compilador trata o overflow como unchecked, este o padro se no especificado. using System; class Overflows{ public static void Main(){ try{ short a = 32767; short b = (short)(a + 1); Console.Write("{1} + 1 = {0}", b, a); }catch (OverflowException e){ Console.WriteLine("Mensagem: {0}", e.Message); } } }

40

Microsoft Visual C# Para compilar o exemplo acima, no prompt, digite csc /checked+

Overflows.cs para a condio checked. Execute o programa digitando Overflows. Depois no prompt, digite csc /checked- Overflows.cs para a condio unchecked. Execute o programa digitando Overflows. A Figura 4, mostra as compilaes e execues da aplicao em C#.

Figura 4: Compilaes e Execues do exemplo Overflows Os comandos checked e unchecked podem ser utilizados dentro do

programa para alterar a condio especificada na compilao. using System; class Overflows2{ public static void Main(){ try{ short a = 32767; short b = unchecked((short)(a + 1)); Console.WriteLine("unchecked: {1} + 1 = {0}", b, a); short c = 32767; short d = checked((short)(c + 1)); Console.WriteLine("checked: {1} + 1 = {0}", d, c); }catch (OverflowException e){ Console.WriteLine("checked: Mensagem - {0}", e.Message); } } } Os comandos unsafe e fixed utilizado na operao com ponteiros. O parmetro /unsafe+ do compilador torna todo o cdigo apto ao tratamento de ponteiros. Por exemplo:

41

Microsoft Visual C# using System; class Pointers{ unsafe public static void Process(int[] a){ fixed (int* pa = a){ for (int i = 0; i < a.Length; ++i) Console.Write("{0} ", *(pa + i)); } } public static void Main(){ int[] arr = {1,2,3,4,5,6,7,8,9,0}; unsafe Process(arr); } } O comando lock utiliza critical section para bloqueio de acesso consecutivo dentro de uma thread. using System; using System.Threading; class Locks{ static int x = 0; public static void ThreadProc(){ lock (typeof(Locks)){ x++; } Console.WriteLine("x = {0}", x); } public static void Main(){ for (int a = 0; a < 10; ++a){ Thread t = new Thread(new ThreadStart(ThreadProc)); t.Start(); } } } a. Exerccios Criando uma calculadora Adicionando funcionalidades a sua calculadora 3. Criando objetos em C# a. Classes Abstratas, classes Seladas e Interfaces Aqui descrevemos o que so Classes Abstratas, Seladas e Interfaces, e tambm explicamos quando devemos implementar cada uma delas em nosso cdigo. b. Introduo

42

Microsoft Visual C# Utilizar classes seladas um novo conceito adicionado ao C#. O conceito de quando utilizar cada tipo de classe pode parecer um pouco confuso no incio, mas aps ter entendido bem os conceitos de cada uma e entender suas similaridades, poderemos partir para um desenvolvimento mais seguro e escalvel. c. O que uma classe abstrata? (Abstract Class) A classe abstrata um tipo de classe que somente pode ser herdada e no instanciada, de certa forma pode se dizer que este tipo de classe uma classe conceitual que pode definir funcionalidades para que as suas subclasses (classes que herdam desta classe) possam implement-las de forma no obrigatria, ou seja ao se definir um conjunto de mtodos na classe abstrata no de total obrigatoriedade a implementao de todos os mtodos em suas subclasses, em uma classe abstrata os mtodos declarados podem ser abstratos ou no, e suas implementaes devem ser obrigatrias na subclasse ou no, quando criamos um mtodo abstrato em uma classe abstrata sua implementao obrigatria, caso voc no implemente o compilador criar um erro em tempo de compilao. Exemplo: abstract class formaClasse { abstract public int Area(); } class quadrado : formaClasse { int x, y; // Se no for implementado o mtodo Area() // ser gerado um compile-time error. public override int Area() { return x * y; } } d. O que uma Interface? (Interface) As interfaces so fundamentais em um sistema orientado a objetos, quando dizemos que um objeto a instncia de uma classe, na verdade queremos dizer, que este objeto implementa a interface definida pela classe, ou seja uma interface define as operaes que um objeto ser obrigado a implementar. Para cada operao declarada por um objeto deve ser especificado o nome da operao, os objetos que esta operao aceita como parmetro e o tipo de valor retornado pela operao; este conjunto de informaes sobre uma determinada operao tem o nome de assinatura da operao, e um conjunto de assinaturas de operaes d-se o nome de interface.

43

Microsoft Visual C# importante lembrar que uma interface nunca contm implementao, ou seja numa interface no se pode definir campos, pois o mesmo uma implementao de um atributo objeto, a interface tambm no permite

construtores pois num contrutor temos as instrues usadas para inicializar campos. Para podermos usar uma interface devemos criar uma classe ou estrutura e herdar da interface, com isso obrigatrio implementar todos os mtodos da interface. Exemplo: interface IExemploInterface { void ExemploMetodo(); } class Implementacaoclasse : IExemploInterface { // Implementao explicita da interface void IExemploInterface.ExemploMetodo() { // Implementao do mtodo } static void Main() { // Declarando uma instancia de uma interface IExemploInterface obj = new Implementacaoclasse(); // chame o mtodo. obj.ExemploMetodo(); } } e. Classes Abstratas X Interfaces Classes Abstratas podem adicionar mais funcionalidades, sem destruir as funcionalidades das classes filhos que poderiam estar usando uma verso mais antiga. Classes abstratas fornecem uma maneira simples e fcil para versionar nossos componentes. Atravs da atualizao da classe base, todas as classes que herdam so atualizadas automaticamente com a mudana. Em uma interface, a criao de funes adicionais ter um efeito sobre suas classes filhos, devido necessidade de implementao dos Mtodos criados na interface. Classes abstratas deveriam ser usadas principalmente para objetos que esto estritamente

relacionados, enquanto o uso de interfaces mais adequado para fornecer funcionalidade comum a classes independentes. Digamos que existem duas classes, de pssaros e de avies, e nas duas exista os mtodos chamados voar(). Seria estranho para uma classe avies herdar a partir de umas classe pssaros apenas porque necessita do mtodo voar(). Em vez disso, o mtodo voar() deve ser definido em uma interface e em ambas as classes pssaros e avies devem implementar a interface. Se quisermos

44

Microsoft Visual C# proporcionar uma funcionalidade em comum para os componentes, devemos utilizar uma classe abstrata. Classes abstratas nos permitem implementar parcialmente uma classe, enquanto a interface no contem a implementao de qualquer membro. Por isso, a seleo de interface ou classes abstratas depende das necessidades e design do nosso projeto. Podemos fazer uma classe abstrata, interface, ou at uma combinao de ambas dependendo de nossas necessidades. Se desejarmos criar uma classe ou mtodo interno para um componente ou library o ideal utilizar o tipo sealed porque qualquer tentativa de anular algumas das suas funcionalidades no ser permitida. Ns podemos marcar uma classe ou mtodo como selados por motivos comerciais, a fim de impedir um terceiro de modificar nossa classe. Por exemplo, no .NET a string uma classe selada. No devemos usar a palavra-chave sealed com um mtodo a menos que o mtodo seja uma mudana de outro mtodo, ou se estamos definindo um novo mtodo e no queremos que ningum mais o sobreponha, no se deve declar-lo como virtual em primeiro lugar. A palavrachave selado fornece uma maneira de garantir que ao sobrepor um mtodo seja fornecido um "final" significa que ningum mais poder sobrepor-lo novamente. Devemos utilizar classes abstratas quando queremos compartilhar

funcionalidades em comum entre classes, e utilizar interfaces quando desejamos que uma classe possua as mesmas assinaturas porem a implementao de cada mtodo no precise ser a mesma. f. O que uma classe selada? (Sealed Class) Uma classe selada utilizada para restringir caractersticas da herana do objeto, quando uma classe definida como sealed, est classe no poder ser herdada, caso voc tente o compilador criara um erro em tempo de compilao. Aps criar uma classe selada pode se observar que o intelisense no mostra o nome da classe definida como sealed quando voc tenta criar uma herana para novas classes. Exemplo: sealed class ClasseSelada { public int x; public int y; } class MainClass { static void Main() {

45

Microsoft Visual C# ClasseSelada sc = new ClasseSelada(); sc.x = 110; sc.y = 150; Console.WriteLine("x = {0}, y = {1}", sc.x, sc.y); } } g. Declarando mtodos A declarao mais simples que podemos fazer de um mtodo (lembrando que isso deve ser feito dentro de uma classe) a seguinte: private void nomeMetodo() { //corpo do mtodo } Onde o nomeMetodo um identificador que define o nome pelo qual o mtodo conhecido, e [corpo do mtodo] consiste de uma lista ordenada de declarao de variveis, de expresses e de comandos. A primeira palavra-chave, void, define o valor retornado pelo mtodo, neste caso, nenhum. E o private informa o tipo do mtodo, ele pode ser private, public, static e protect. Podemos usar qualquer tipo de dado vlido como valor de retorno de um mtodo. Nesse caso, ao terminar, o mtodo seria obrigado a devolver um dado do tipo especificado. Por exemplo: class Numero { double x = 1; private void print() { Console.WriteLine("O valor e " + x); } } h. Moderadores de acesso Os moderadores de acesso so empregados para restringir o acesso a um mtodo. Entretanto, independentemente do moderador escolhido, um mtodo sempre acessvel, isto , pode ser chamado, a partir de qualquer outro mtodo contido na mesma classe. Os moderadores de acesso existentes em Java so os seguintes: Public O mtodo declarado com este moderador pblico e pode ser chamado a partir de mtodos contidos em qualquer outra classe. Esta a condio de menor restrio possvel. Private

46

Microsoft Visual C# O mtodo privativo da classe que o contm e seu uso vedado a qualquer. Protected O mtodo protegido pode ser chamado por todas as classes que compe um conjunto maior chamado package. importante avisar que voc pode ter problemas em identificar violaes com respeito chamada de mtodos protegidos. Isso se deve ao fato do compilador no sinalizar esse fato precisamente, isto , a tentativa de chamar um mtodo protegido a partir de uma classe que no faz parte do package. Ao invs disso a mensagem poder se parecer com a seguinte: No method matching funcao() found in class Matematica. Internal Esse tipo poder ser acessado por qualquer classe do projeto. Protected Private O mtodo acessvel pela classe que o contm, assim como por qualquer classe que tenha sido derivada dessa classe. Porm, isso somente permitido apenas dentro de um mesmo arquivo-fonte. Static Uma classe esttica basicamente a mesma que uma classe no-esttica, mas a diferena que uma classe esttica no pode ser instanciada. Em outras palavras, voc no pode usar a palavra-chave new para criar uma varivel do tipo da classe. Como no h nenhuma varivel de instncia, voc acessa os membros de uma classe esttica usando o nome de classe propriamente dito. Por exemplo, se voc tiver uma classe esttica denominada classeUtilidade contendo um mtodo pblico chamado criptografaSenha(), voc chama o mtodo conforme o exemplo seguinte: classeUtilidade.criptografaSenha(); i.Estrutura dos mtodos O par de parnteses adiante do nome do mtodo introduz uma lista (vazia, neste caso) de argumentos. A chamada de um mtodo pode ser acrescida de parmetros, os quais so associados aos seus respectivos argumentos. Um exemplo de mtodos que retornam valores o seguinte: class Calculo {

47

Microsoft Visual C# int Soma(int a, int b) { return a + b; } double Produto(double a, double b) { return a * b; } } O primeiro mtodo, Soma(), realiza a adio de dois nmeros inteiros fornecidos pelos argumentos a e b, e retorna o valor dessa soma. O segundo mtodo, Produto(), realiza a multiplicao de dois nmeros de ponto-flutuante a e b e retorna seu produto. A sintaxe completa para a declarao de um mtodo a seguinte: [moderadores de acesso] [modificador] [tipo do valor de retorno] [nome] ([argumentos]) throws [lista de excesses] { [corpo] } j. Usando Construtores de Instncias Construtores de instncia so usados para criar e inicializar instncias. O construtor da classe chamado quando voc Criar um novo objeto, por exemplo: class CoOrds { public int x, y; // constructor public CoOrds() { x = 0; y = 0; } } Esse construtor chamada sempre que um objeto com base na classe CoOrds criado. Um construtor que leva sem argumentos, como este, chamado de construtor de padro. No entanto, geralmente til fornecer construtores adicionais. Por exemplo, podemos adicionar um construtor para a classe CoOrds que permite especificar os valores iniciais para os membros de dados: // A constructor with two arguments: public CoOrds(int x, int y) { this.x = x; this.y = y; }

48

Microsoft Visual C# Isso permite que objetos CoOrd poder ser criados com padro ou valores iniciais especficos, como este: CoOrds p1 = new CoOrds(); CoOrds p2 = new CoOrds(5, 3); Se uma classe no tem um construtor padro, uma gerada

automaticamente e valores padro so usados para inicializar os campos de objeto, por exemplo, uma de int inicializada com 0. Portanto, o construtor padro da classe CoOrds inicializa todas as variveis com zero, ele pode ser removido completamente sem alterar o funcionamento da classe. Construtores de instncia tambm podem ser usadas para chamar os construtores de instncia de classes base. O construtor da classe filho pode chamar o construtor da classe base atravs do inicializador, da seguinte maneira: class Circle : Shape { public Circle(double radius) : base(radius, 0) { } } Neste exemplo, a classe Circle passa valores que representa o raio e altura para o construtor fornecido pelo Shape do qual Circle derivada. Exemplo 1 O exemplo a seguir demonstra uma classe com construtores de classe dois, sem argumentos e outra com dois argumentos. class CoOrds { public int x, y; // Default constructor: public CoOrds() { x = 0; y = 0; } // A constructor with two arguments: public CoOrds(int x, int y) { this.x = x; this.y = y; } // Override the ToString method: public override string ToString() { return (String.Format("({0},{1})", x, y)); } } class MainClass { static void Main() { CoOrds p1 = new CoOrds(); CoOrds p2 = new CoOrds(5, 3); // Display the results using the overriden ToString method: Console.WriteLine("CoOrds #1 at {0}", p1);

49

Microsoft Visual C# Console.WriteLine("CoOrds #2 at {0}", p2); Console.ReadKey(); } } /* Output: CoOrds #1 at (0,0) CoOrds #2 at (5,3) */ Exemplo 2 Neste exemplo, a classe Person no tem nenhum construtor, um construtor padro fornecido automaticamente e os campos so inicializados com seus valores padro. public class Person { public int age; public string name; } class TestPerson { static void Main() { Person person = new Person(); Console.WriteLine("Name: {0}, Age: {1}", person.name, person.age); // Keep the console window open in debug mode. Console.WriteLine("Press any key to exit."); Console.ReadKey(); } } // Output: Name: , Age: 0

Observe que o valor padro de age 0 e o valor padro de name null. Exemplo 3 O exemplo a seguir demonstra o uso o inicializador de classe base. A classe Circle derivada da classe geral Shape, e a classe Cylinder derivada da classe Circle. O construtor em cada classe derivada est usando o inicializador de classe base. abstract class Shape { public const double pi = Math.PI; protected double x, y; public Shape(double x, double y) { this.x = x; this.y = y; } public abstract double Area(); } class Circle : Shape { public Circle(double radius) : base(radius, 0) { } public override double Area() { return pi * x * x; } }

50

Microsoft Visual C# class Cylinder : Circle { public Cylinder(double radius, double height) : base(radius) { y = height; } public override double Area() { return (2 * base.Area()) + (2 * pi * x * y); } } class TestShapes { static void Main() { double radius = 2.5; double height = 3.0; Circle ring = new Circle(radius); Cylinder tube = new Cylinder(radius, height); Console.WriteLine("Area of the circle = {0:F2}", ring.Area()); Console.WriteLine("Area of the cylinder = {0:F2}", tube.Area()); // Keep the console window open in debug mode. Console.WriteLine("Press any key to exit."); Console.ReadKey(); } } /* Output: Area of the circle = 19.63 Area of the cylinder = 86.39 */ 4. Tcnicas de programao orientada a objeto em C# a. Classes e Objetos No mundo orientado a objetos, tudo focado em classes e em objetos. Precisamos ento defini-los para podermos entender as diferenas entre os dois e comearmos a entrar realmente no mundo da POO (Programao Orientada a Objetos). Quando construindo algo, temos duas fases distintas, mas que so imprescindveis ao sucesso do nosso projeto: a formalizao do que estamos criando e a transformao da formalizao (projeto) em algo fsico. Essas duas fases esto representadas no mundo orientado a objetos pela classe (formalizao, projeto de algo) e pelo objeto (transformao do projeto em algo fsico, ou seja, uma varivel na memria). Vamos imaginar o caso em que temos de construir um computador. Antes de construir o computador, temos que definir suas propriedades, formas, aes que executar. Teramos ento que montar um projeto do computador, o que na orientao a objetos significa criar uma classe. Se pensarmos que um computador possui monitor, mouse, teclado e gabinete, devemos ento acrescentar essas caractersticas do computador ao nosso projeto. Cada caracterstica de uma classe

51

Microsoft Visual C# chamada de atributo. Devemos ento ter uma classe chamada Computador que possui quatro atributos. Alm de declarar as caractersticas das classes, devemos tambm definir as aes que o nosso futuro objeto poder executar. Essas aes so definidas por meios de mtodos, que sero estudados mais adiante. Vamos ento definir uma classe em C# utilizando a palavra chave "class" no incio do cdigo e guardando seus atributos com seus respectivos tipos. Os atributos nada mais so que variveis globais a classe. Veja no cdigo abaixo a definio da classe Computador: class Computador { Monitor monitor; Teclado teclado; Mouse mouse; /*abaixo podemos criar vrios mtodos que definem as aes de um computador */ } b. Criando Objetos Agora que j sabemos como definir uma classe, podemos passar ao ponto de criar objetos da classe definida. importante perceber o fato de que podemos criar vrios objetos da mesma classe, no ficando limitado a apenas um objeto. Quando vamos criar um objeto em C# utilizamos a palavra chave "new" seguindo o seguinte esquema: <Tipo> <nome> = new <Tipo>() Veja ento um exemplo do objeto Computador com o nome comp1: Computador comp1 = new Computador(); Perceba que na criao do objeto, aps o new, chamamos o tipo Computador seguido de parnteses. Essa notao significa que neste momento ser executado um mtodo especial da classe Computador chamado construtor. O construtor um mtodo que possui o mesmo nome da classe, que no retorna nenhum valor e que chamado cada vez que um objeto da classe criado. Quando no criamos nenhum construtor (como na classe Computador acima), o construtor vazio, que no recebe nenhum parmetro e tambm no executa nenhum cdigo, criado automaticamente.

52

Microsoft Visual C# Veja a classe Computador modificada com um construtor que recebe 3 strings e preenche os atributos da classe com essas strings: namespace Construtor { class Computador { string monitor; string teclado; string mouse; public Computador(string m, string t, string r) { monitor = m; teclado = t; mouse = r; } } public class App { public static void Main() { Computador comp1 = new Computador("Monitor", "Teclado", "Mouse"); Computador comp2 = new Computador("Monitor2", "Teclado2", "Mouse2"); //essa linha daria erro de compilao: new Computador(); } } } Nesse cdigo, criar um objeto com o construtor vazio daria um erro de compilao j que, ao criar o construtor que recebe 3 string, "apagamos" o construtor vazio. Tipos por valor x Tipos por referncia. Os tipos pr-definidos em C# so normalmente conhecidos como tipos por valor. Esses tipos devem permitir um acesso rpido j que so muitas vezes utilizados no cdigo. Dessa forma, os tipos por valor tm guardados na memria apenas o seu valor, sem nenhuma outra informao adicional que poderia causar um gasto desnecessrio de memria. Os tipos criados por classes, os objetos, so conhecidos como tipos "por referncia". Essa denominao vem do fato de que esses tipos no guardam o seu valor, mas sim uma referncia para um local na memria que contm o valor. Com essas definies, importante perceber que, se copiarmos as informaes de variveis de tipos por valor e de variveis de tipos por referncia, teremos comportamentos diferentes. Caso copiemos uma varivel por valor, o que ocorre que uma nova cpia do valor passada para a outra varivel. Isso significa que caso modifiquemos uma das variveis, nada ocorrer com a outra.

53

Microsoft Visual C# Em variveis por referncia o que ocorre ao copiarmos para outra varivel que apenas a referncia copiada, no o valor. Aps a cpia o que acontece que teremos duas variveis apontando para um mesmo valor. Isso significa que, ao modificarmos uma varivel, estaremos na realidade modificando o valor para o qual a outra varivel tambm est apontando, significando que o valor da outra varivel tambm ser modificado. Veja o cdigo abaixo e observe o resultado: class Computador { public string monitor; public string teclado; public string mouse; public Computador(string m, string t, string r) { monitor = m; teclado = t; mouse = r; } public override string ToString() { return this.monitor + " " + this.teclado + " " + this.mouse; } } public class App { public static void Main() { //cria uma varivel de tipo por valor int valor1 = 10; //copia para outra varivel int valor2 = valor1; //adiciona 5 a valor2 valor2 += 5; //imprime o valor das duas: Console.WriteLine("valor1: " + valor1); Console.WriteLine("valor2: " + valor2); //cria um objeto de tipo por referncia Computador comp1 = new Computador("Monitor1", "Teclado1", "Mouse1"); //copia a referncia Computador comp2 = comp1; //modifica o valor do monitor: comp2.monitor = "Modificado!"; //imprime as duas datas: Console.WriteLine("comp1: " + comp1); Console.WriteLine("comp2: " + comp2); } } Veja o resultado:

54

Microsoft Visual C#

Mesmo tendo modificado apenas um dos objetos (o comp2), o comp1 tambm foi modificado, provando que na verdade os dois objetos referenciam o mesmo endereo na memria. Perceba que tivemos que modificar a classe Calculadora adicionando a ela o mtodo ToString() para que o Console.WriteLine() pudesse recuperar o valor da comp1 e comp2 automaticamente para uma string. c. Usando Herana Herana uma dos trs princpios fundamentais da programao orientada a objetos porque ela permite a criao de hierarquia nos objetos que compem o sistema. Em C#, uma classe que tem seus dados e mtodos herdados por outra chamada de classe base ou super classe e a classe que herda tais dados chamada de classe derivada ou sub-classe. O que um aluno, um professor e um funcionrio possuem em comum? Todos eles so pessoas e, portanto, compartilham alguns dados comuns. Todos tm nome, idade, endereo, etc. E, o que diferencia um aluno de uma outra pessoa qualquer? Um aluno possui uma matrcula; Um funcionrio possui um cdigo de funcionrio, data de admisso, salrio, etc; Um professor possui um cdigo de professor e informaes relacionadas sua formao. aqui que a herana se torna uma ferramenta de grande utilidade. Podemos criar uma classe Pessoa, que possui todos os atributos e mtodos comuns a todas as pessoas e herdar estes atributos e mtodos em classes mais especficas, ou seja, a herana parte do geral para o mais especfico. Comece criando uma classe Pessoa como mostrado no cdigo a seguir: class Pessoa { public string nome; public int idade; } Esta classe possui os atributos nome e idade. Estes atributos so comuns a todas as pessoas. Veja agora como podemos criar uma classe Aluno que herda estes atributos da classe Pessoa e inclui seu prprio atributo, a saber, seu nmero de matrcula:

55

Microsoft Visual C# class Aluno : Pessoa { public string matricula; } Observe que, em C#, os dois-pontos so usados para indicar a herana. A classe Aluno agora possui trs atributos: nome, idade e matricula. Veja um aplicativo demonstrando este relacionamento: static void Main(string[] args) { // cria um objeto da classe Aluno Aluno aluno = new Aluno(); aluno.nome = "Osmar J. Silva"; aluno.idade = 36; aluno.matricula = "AC33-65"; // Exibe o resultado Console.WriteLine("Nome: " + aluno.nome + "\n" + "Idade: " + aluno.idade + "\n" + "Matrcula: " + aluno.matricula); Console.WriteLine("\n\nPressione uma tecla para sair..."); Console.ReadKey(); } A herana nos fornece um grande benefcio. Ao concentrarmos

caractersticas comuns em uma classe e derivar as classes mais especficas a partir desta, ns estamos preparados para a adio de novas funcionalidades ao sistema. Se mais adiante uma nova propriedade comum tiver que ser adicionada, no precisaremos efetuar alteraes em todas as classes. Basta alterar a superclasse e pronto. As classes derivadas sero automaticamente atualizadas. d. Polimorfismo O polimorfismo uma facilidade que permite que dois ou mais objetos diferentes respondam a mesma mensagem. Utilizar polimorfismo, em linguagens de Programao Orientada a Objeto (OOP), podemos dizer que quase indispensvel, j que esta uma maneira de desenvolvimento que traz muitos benefcios, Clareza no cdigo, Distribui melhor a complexidade da aplicao entre outras. Neste modelo de desenvolvimento OOP, fundamental a utilizao de classes, no modelo do polimorfismo. Algumas classes sero objetos e outras classes filhas sero mtodos do objeto. Objeto tudo aquilo que existe, como casa, carro, avio, cachorro e etc. Mtodos so todas as aes que estes objetos possuem.

56

Microsoft Visual C# Para que fique claro este assunto de objeto e mtodo, vamos imaginar 3 classes: Carro, Acelerar e Frear. Vamos verificar um exemplo de Polimorfismo: //Classe public abstract class Carro { public abstract bool acao(); } Verifique que no cdigo acima, crio a classe carro e determinando qual evento este objeto ter. //Classe public class Acelerar : Carro { public override bool acao() { Console.WriteLine("O Carro est acelerando."); return true; } } public class Frear : Carro { public override bool acao() { Console.WriteLine("O Carro est freando."); return true; } } Verifique que no cdigo acima crio outras 2 classes herdando a classe carro, ou seja, essas classes passaro a ser mtodos da classes Carro. //Formulrio public bool carro_em_movimento(Carro car) { return car.acao(); } private void btn_cal_Click(object sender, System.EventArgs e){ if (this.opt_acelera.checked){ carro_em_movimento(new Acelerar()); }else{ carro_em_movimento(new Frear()); } } Verifique que no formulrio foi criado uma funo CARRO_EM_MOVIMENTO, para referenciar o objeto Carro, assim que, a funo chamada e voc faz a passagem do parmetro, possvel visualizar os mtodos disponveis na classe Carro. No polimorfismo os mtodos de um objeto somente sero visualizados, quando o objeto que eles pertencem chamado na aplicao. Com o uso do Polimorfismo fica muito mais fcil a manuteno do cdigo fonte e a criao de novos mtodos da classe, para isso, basta criar uma nova classe (ex: Ligar_a_Luz) herdando a classe Carro, a classe Ligar_a_Luz passar a ser mtodo da Classe Carro.

57

Microsoft Visual C# e. Exerccios Criando estrutura de classes para uma sala de aula 5. Criando uma aplicao Web a. Criando um formulrio para aplicaes Web Entendendo o que MasterPage comum em aplicaes convencionais ou mesmo Web a necessidades de criarmos partes de contedo que sero exibidas em todas ou pelo menos em diversas pginas. No ASP clssico isso era resolvido da seguinte forma: Voc desenvolvia o contedo separadamente e sua incluso era feito onde necessrio atravs de uma tag Include. No ASP.NET 1.1 surgiu uma novidade: os chamados Web User Controls, que so arquivos com a extenso ascx, que podiam ser programados na IDE do Visual Studio e adicionados a qualquer Web Form. Trouxe significativas vantagens em relao ao uso do include, como o fato da pagina host ter a possibilidade de ler ou alterar valores de controles ou propriedades. Sua grande desvantagem era que no possua herana visual como j h um longo tempo era possvel em aplicaes convencionais: O user control em tempo de design eram representados na IDE do VS como um boto cinza. No ASP.NET 2.0 uma das grandes novidades apresentadas e que obviamente continuam disponveis na verso 3.5 so as Master Pages, que trazem finalmente a herana de contedo de forma visual. Uma MasterPage um arquivo com extenso master. Pode ser criada no IDE do VS no modelo code-behing ou code-inline, assim como um Web Form. Sua estrutura bsica tambm muito parecida com um Web Form: <%@ Master Language="VB" CodeFile="Master.master.vb" Inherits="Master" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head id="Head1" runat="server"> <title>Untitled Page</title> </head> <body> <form id="form1" runat="server"> <div> <asp:contentplaceholder id="ContentPlaceHolder1" runat="server"> </asp:contentplaceholder> </div>

58

Microsoft Visual C# </form> </body> </html> A principal diferena a diretiva de compilao @Master, no lugar de @Page. Esta diretiva informa ao ASP.NET durante o processo de compilao que trata-se uma Master Page. Uma pgina aspx que utiliza uma Master Page chamada de pgina de contedo (Content Page). Uma pgina de contedo no contem os elementos que formam uma pgina HTML comum, pois estes sero herdados da Master Page. Numa Master Page, as reas onde uma pagina de contedo tero disponvel para exibir seu contedo so definidas atravs de controles de servidor

contentplaceholder. No cdigo acima voc pode ver um controle contentplaceholder criado por padro na criao da MasterPage. b. Criando uma Master page Criar uma Master Page no Visual Studio simples: Na caixa de dialogo Add New Item Selecione Master Page, defina um nome para a pgina. O VS cria a MasterPage com o nome escolhido. Se voc optou pelo modelo code-behind, sero criados dois arquivos: um arquivo master e um vb ou cs, conforme a linguagem escolhida. Se a opo foi code-inline, ser criado apenas o arquivo .master. c. Utilizando uma Mater Page Definir a(s) pgina(s) de contedo simples e pode ser feito quatro maneiras diferentes: Durante a criao da pgina, na caixa de dialogo Add New Item, marque a opo Select Master Page

59

Microsoft Visual C#

Ser exibida a caixa de dialogo Master Page, que exibe as Master Pages disponveis no projeto:

Baste selecionar a pgina Master e clicar em Ok.

60

Microsoft Visual C# A segunda atravs da prpria pagina Master, selecionando a opo Add Content Page. Ser criada uma pgina de contedo em branco. Voc no poder escolher o nome da pgina no momento da sua criao. A terceira de forma manual. Crie um Web Form normalmente, remova todo o HTML gerado, com exceo da diretiva de pgina. Adicione a diretiva de pgina o atributo MasterPageFile, que indica que esta uma pgina de contedo que utiliza a Master Page especificada no atributo. Finalmente, a quarta e ltima, e em tempo de execuo: protected void Page_PreInit(object sender, EventArgs e) { Page.MasterPageFile = "~/MasterUm.master"; } A defninio de uma pagina Master em tempo de execuo deve ser feito no evento PreInit da pgina. Obviamente que esta ltima forma nos priva dos beneficios da herana visual. d. Trabalhando com uma Master Page Este no um curso de Web Design, portanto no perca tempo ou se preocupe com a aparncia de suas atividades prticas. Nesta sesso vamos demonstrar de maneira prtica como tirar proveito da utilizao de uma Master Page. Crie uma nova aplicao ASP.NET; Crie uma nova Master Page; Defina o layout da Master Page de acordo com a figura abaixo:

61

Microsoft Visual C#

Para os quatro controles da esquerda, que devero funcionar como HyperLinks, utilize controles de Servidor HyperLinks, defina a propriedade text de cada um como Desentupimento, Hidrulica, Limpeza e Hidrojateamento. A propriedade NavigateUrl de cada um deve ser definida pelo mesmo contedo da propriedade text mais a exteso aspx, por exemplo: Desentupimento.aspx. Crie quatro pginas de contedo com os nomes especificados nas

propriedades NavigateUrl acima, especificando como Master Page a pgina criada. Defina um contedo especifico para cada pgina de contedo, conforme exemplo abaixo: Na rea Content da pgina de contedo voc pode trabalhar livremente: adicionar controles, eventos etc.

62

Microsoft Visual C#

Defina uma das pginas de contedo criada como pgina inicial e rode a aplicao. Navega entre as pginas e veja na prtica o funcionamento da aplicao. Acessando a pgina Master da pgina de contedo Voc pode facilmente acessar qualquer controle ou propriedade da pgina Master, na pgina de contedo, atravs da propriedade Master. Por exemplo, para ler o contedo de um dos HyperLinks da pgina Master: if (!Page.IsPostBack) { string s = (Master.FindControl("Desentupimento") as HyperLink).Text; } Tambm podemos alterar o texto ou mesmo qualquer propriedade do controle na Master Page, pois nossa operao por referencia: HyperLink Hyper; Hyper = (Master.FindControl("Desentupimento") as HyperLink); Hyper.ForeColor = System.Drawing.Color.Red; Neste exemplo, estamos mudando a cor do HyperLink do contedo da pgina Master para vermelho. e. Alterando o Ttulo das pginas de contedo

63

Microsoft Visual C# A pgina de contedo deve conter um atributo title, onde deve ser definido o titulo para exibio da pgina. Na ausncia deste, ser exibido o titulo da Master Page. Outra alternativa definir no cdigo o ttulo para a pgina: Master.Page.Title = "Titulo definido em tempo de execuo"; Trabalhando com contedo padro Outra possibilidade interessante a de trabalhar com contedo padro. Voc pode definir um contedo padro de exibio na rea da pgina de contedo, da mesma forma que voc define o restante da pgina. Na pgina de contedo, para exibir o contedo padro, basta clicar em Default to Master Content na Smart Tag do controle de contedo. f. Master Pages aninhadas Alem de tudo o que estudamos, possvel mais. Voc pode criar Master Pages aninhadas, em diferentes nveis. O VS 2005 no da suporte em sua IDE para este recurso, portanto voc ter que fazer todo o trabalho manualmente. Uma grande novidade que podemos encontrar no ASP.NET 2.0 o recurso Master Page (Herana Visual). Com esse recurso podemos criar uma pagina padro e depois replicar a aparncia visual para as outras paginas. Caso precise mudar, basta alterar em um nico ponto. A Master Page pode ser definida na diretiva da pagina, dinamicamente via cdigo e at no web.config para que todas paginas j saiam com uma Master Page. Confira na figura 01 uma Master Page e na figura 02 sua utilizao dentro de um web form.

64

Microsoft Visual C#

Figura 01 - Master Page

Figura 02 - Pagina usando uma Master Page g. Criando Master Page V ao Solution Explorer, boto direito no seu projeto, Add New Item e escolha o tempate Master Page conforme figura 03. Confirmando ser criado um arquivo com a extenso "*.master" que indica que esse arquivo uma Master Page.

65

Microsoft Visual C#

Figura 03 - Criando uma Master Page Com a Master Page criada conforme figura 04, adicione um texto que usaremos como padro. A rea que aparece como ContentPlaceHolder ser o espao reservado para adicionar o contudo do WebForm. Voc pode adicionar quantos Contents forem necessrios.

Figura 04 - Nova Master Page Apartir desse momento j podemos criar uma nova pagina (webform) que utilize uma Master Page para definir sua aparncia. Adicione ento um novo WebForm conforme figura 05 e marque o checkbox "select master page". Aps confirmar vai mostrar a tela da figura 06, onde voc deve escolher uma Master Page.

66

Microsoft Visual C#

Figura 05 - Criando nova pagina e relacionando Master Page

Figura 06 - Selecionando Master Page Aps confirmar teremos o resultado apresentando na figura 07, adicione um texto dentro do Content e execute sua pagina no navegador, o resultado deve ser similar a figura 08.

67

Microsoft Visual C#

Figura 07 - Nova Pagina

Figura 08- Testando a pagina Acesso objetos da Master Page

possvel acessar objetos em uma Master Page e alterar valores dinamicamente. Retorne a nossa PaginaPadrao.Master e onde tinha colocado um texto "Master Page" retire o mesmo e coloque um Label, com as propriedades:

Text="",ID=lblTitulo. Confira na figura 09.

Figura 09 - Adicionando Label na Master Page. Agora efetue dois cliques na Master Page e vamos ao code behind. Adicione a propriedade AlteraTitulo conforme listagem 01.

68

Microsoft Visual C# Public WriteOnly Property AlteraTitulo() As String Set(ByVal value As String) Me.lblMaster.Text = value End Set End Property Listagem 01 - Propriedade AlteraTitulo Agora retorne ao webform que criamos e adicione um Label, um TextBox e um Button conforme figura 10. Ainda nessa pagina efetue a codificao do boto conforme listagem 02.

Figura 10 - Alterando Pagina (WebForm) Protected Sub Button1_Click(ByVal sender As Object, ByVal e As

System.EventArgs) Handles Button1.Click CType(Master, PaginaPadrao).AlteraTitulo = Me.TextBox1.Text End Sub Listagem 02 - Propriedade AlteraTitulo Aps adicionar o cdigo j poderemos testar conforme figura 11.

Figura 11 Testando

69

Microsoft Visual C# Diretivas de Pagina O arquivo.master contm a diretiva @Master : <%@ Master Language="VB" CodeFile="Mastermodelo.master.vb"

Inherits="Mastermodelo" %> A pagina contm a diretiva MasterPageFile : <%@ Page Language="VB" AutoEventWireup="false"

MasterPageFile="~/MasterPages/PaginaPadrao.master"

CodeFile="Nova_Pagina.aspx.vb" Inherits="Nova_Pagina" title="Untitled Page" %> Observando cdigo da listagem 02 foi necessrio fazer casting para ter acesso a propriedade da Master, para no ser necessrio, na pagina adicione o atributo MasterType: <%@ MasterType VirtualPath="PaginaPadrao.master" %> Adicionando essa diretiva na pagina poderemos alterar cdigo conforme listagem 03. Protected Sub Button1_Click(ByVal sender As Object, ByVal e As

System.EventArgs) Handles Button1.Click 'CType(Master, PaginaPadrao).AlteraTitulo = Me.TextBox1.Text Master.AlteraTitulo = Me.TextBox1.Text End Sub Listagem 03 - Propriedade sem fazer casting Finalizando Master Pages conforme voc conferiu veio para facilitar mais ainda o trabalhado do desenvolvedor que agora vai ter uma pagina padro com o layout que pode ser alterado a qualquer momento em um nico ponto. Faa o download do cdigo. h. Acessando dados atravs do formulrio de aplicaes Web Configurando e utilizando Session Session (sesso) o perodo de tempo em que o usurio interage com a aplicao. Em termos de programao a sesso a memria em forma de dicionrio ou ainda de uma tabela hash. Por exemplo, a sesso pode ser um

70

Microsoft Visual C# conjunto de valores-chave que podem ser definidos e lidos por um usurio, durante a utilizao da aplicao web pelo mesmo. A configurao da sesso feita diretamente no web.config:

Figura 1 - Configurao do web.config para InProc As opes para a configurao so as seguintes: Mode: O Asp.Net suporta dois modos: no processo e fora do processo. Sendo assim o modo de configurao suporta trs opes: inproc, stateserver e sqlserver; Cookieless: Define se o cookie estar ativo ou no para o Asp.Net, definido por um valor booleano; Timeout: Define por quanto tempo a sesso vlida. calculado pelo tempo atual mais o tempo de timeout. Deve-se passar o valor em minutos e por default no .NET a sesso dura vinte minutos; SqlConnectionString: a referncia da conexo de banco de dados do SQL Server; Server: No modo StateServer o nome do servidor que est executando os servios do Windows NT: ASPSTATE; Port: Identifica o nmero da porta do servidor quando este se encontra configurado no modo stateserver; i. Modos de Configurao InProc O mode de processo (InProc) utiliza basicamente a sesso do Asp.NET, ou seja, a sesso controlada em processo e caso o processo seja re-cclico o estado perdido. Em termos de desempenho o mais rpido, pois o dado j est em processo. Quanto configurao utiliza cokieless e o timeout da configurao padro da sesso do ASP.NET.

71

Microsoft Visual C# No caso de perder a sesso os dados sero perdidos, para fazer um teste basta adicionar um valor na sesso (vide o tpico utilizando a sesso deste mesmo artigo) e logo em seguida parar e iniciar novamente o servio do ISS (iisreset) e verificar que o valor foi perdido. StateServer Neste modo de configurao a sesso gerenciada por um servio, o ASPSTATE que deve ser iniciado. Para iniciar o servio abra o prompt de comando navegue at o diretrio da framework "v1.0.2204" (Ex: "c:\Windows\Microsoft .net\framework\v1.0.2204") e execute o comando:

Figura 2 - Iniciando o servio aspstate. Depois de iniciado o servio basta mudar no web.config a opo mode para stateserver, conforme figura abaixo:

Figura 3 - Configurao do web.config para stateserver. Podemos agora repetir o teste realizado no modo InProc que ao pausar e iniciar novamente o servio do IIS o valor adicionado na sesso ser mantido. SQL Server Mode Funciona da mesma maneira que o stateserver, porm a sesso armazenada no SQL. Para utilizar o SQL Server state necessrio criar as tabelas em que o Asp.NET ir procurar os dados, para isso o .NET SDK j nos trs um script pronto o state.sql. O script se encontra no mesmo caminho que o aspstate modificando somente a verso do framework desejada.

Para executar o script utilizaremos linha de comando no prompt de comando e o comando osql conforme a figura abaixo:

Figura 4 - Executando o state.sql.

72

Microsoft Visual C# Aps executado o script deve-se reiniciar o servio do SQL Server para que os novos servios criados a partir do state.sql possam tambm ser iniciados. Em seguida deve-se alterar o web.config de maneira que fique semelhante ao exemplo a seguir.

Figura 5 - Configurando o web.config para o SQL Server mode. Se novamente repetirmos o teste e reiniciarmos o servio do ISS notaremos que no perdemos o valor da sesso e desta vez temos um nvel de confiana maior, pois dificilmente o SQL pararia de funcionar e em caso desse servidor parar outro poderia assumir em sua lugar. j. Utilizando a Sesso Depois de configurarmos vamos ver como utilizar a sesso. Primeiramente vamos abrir o visual Studio e criar um aplicao web utilizando o menu File -> New Project -> (C# ou VB) Web -> Asp.NET Web Application. Vamos dar o nome do projeto de "Sessao". Agora vamos adicionar duas textbox e trs botes para podermos verificar o funcionamento da sesso.

Primeiro iremos adicionar um mtodo que ser responsvel pela verificao da varivel de sesso que vamos chamar de "variavelSessao" e em caso desta existir e possuir valor ir passar este valor a txtSessao2.

73

Microsoft Visual C#

Vamos agora adicionar um evento para cada boto e juntamente de cada um os valores de como inserir, alterar e limpar a sesso. Inserindo o valor na sesso:

Alterando o valor na sesso:

Ao fazer a alterao no valor que est na sesso tambm pode ser utilizado a mesma linha de quando inserimos o valor na sesso, uma vez que se o a varivel j existir ela ter seu valor sobrescrito. Excluindo o valor na sesso:

Limpando a sesso:

74

Microsoft Visual C#

Para limpar a sesso ainda possvel utilizar o seguinte comando: Agora no Page_Load vamos acrescer o cdigo que ir verificar o postback e tambm verificar o valor da sesso.

Agora que j configuramos e aprendemos a utilizar a Session, devemos lembrar que no se deve colocar tudo na Session, pois no temos controle de quanta informao ela pode guardar. A session no como um array que estoura quando chega ao seu limite, ela sobrescreve os dados. Fica o conselho de usar a session quando for tramitar valores entre as pginas ao invs de usar querystrings e ou ainda utiliz-la para guardar valores temporrios como um login de usurio por exemplo. Nunca se esqueam, depois de usarem os valores e no necessitarem mais dos mesmos, retirem-nos da session! Como armazenar uma informao temporria e que preciso acessar rapidamente? Qual o desenvolvedor que nunca se deparou com tal pergunta ou no sabia o que seria melhor para resolver seu problema. Session, ViewState e Cache so trs grandes ferramentas que podem nos ajudar nesta tarefa. Mas voc deve estar se perguntando qual deles a melhor soluo? Depende da situao e este artigo visa lhe levar at o caminho da melhor soluo. Session (sesso) o perodo de tempo em que o usurio interage com a aplicao. Em termos de programao a sesso a memria em forma de

75

Microsoft Visual C# dicionrio ou ainda de uma tabela hash. Por exemplo, a sesso pode ser um conjunto de valores-chave que podem ser definidos e lidos por um usurio, durante a utilizao da aplicao web pelo mesmo. A Session por default no .NET possui um timeout de vinte minutos podendo ser redefinida (este caso ser abordado num prximo artigo). Estes vintes minutos so contados a partir do momento em que o usurio deixa de interagir com o sistema, enquanto isso no ocorre este tempo no vlido. ViewState um conjunto de informaes escondidas mantidas pela pgina ASP.NET. Ele monitora as mudanas feitas na pgina durante o post back. Nas pginas do ASP.NET o ViewState habilitado por default para todos os componentes do .NET Framework e pode ser visto (criptografado) ao trmino do carregamento da pgina .aspx clicando-se com o boto direito do mouse e em seguida em Exibir Cdigo Fonte, aps isto basta localizar a tag _VIEWSTATE. Cache tambm um tipo de memria, no caso do ASP.NET a memria da mquina/servidor onde o cdigo fonte est em execuo. Pode-se verificar a ao do Cache neste momento, ao entrar no site pela primeira vez o carregamento da pgina foi um pouco lento e se nesse exato momento voc apertar o boto F5 do seu teclado perceber que esta pgina ir carregar bem mais rpido do que a primeira vez. Isto se deve a ao do Cache, no primeiro acesso a pgina o servidor iniciado e os dados so recebidos pelo seu computador, que armazena estes dados no Cache permitindo assim que no futuro a ao seja executada com maior rapidez. Vantagens: Session o Aceita qualquer tipo de varivel e pode ser acessada a todo o momento,

lembrando sempre de verificar se o valor adicionado no nulo ou se ainda a sesso no for perdida. o Muito boa para trafegar pequenos dados como algumas variveis ou

valores de referncia. ViewState o Excelente para quem deseja armazenar informaes numa pgina que

precisa ser recuperada de maneira rpida e prtica, ou ainda algum valor que de real importncia para a pgina.

76

Microsoft Visual C# Cache o Rapidez na aquisio da informao uma vez que a mesma j se

encontra carregada. o Possibilidade de configurao para estender o cach a longos perodos

como horas. Desvantagens: Session o o Possui timeout que pode dificultar a recuperao dos dados. Deve-se tomar cuidado ao adicionar valores, pois a Session no estoura

como um array ela simplesmente sobrescreve os dados. ViewState o o o o No Transporta valores entre as pginas, nico para cada pgina. No recria dinamicamente os controles da pgina. No restaura os valores dos controles aps o postback. Quanto maior o ViewState mais pesada/lenta fica a pgina.

Cache o Possibilidade de StackOverFlow se no for bem controlado.

Vrias configuraes podem ser feitas para estas trs ferramentas, mas estas sero abordadas junto das demonstraes nos prximos artigos. k. Exerccios Criando uma autenticao de usurio via cdigo Usando MasterPage 6. Programao em camadas com C# Aqui vamos demonstrar passo-a-passo a construo de uma aplicao .Net utilizando o conceito de desenvolvimento em camadas. Nosso objetivo permitir voc praticar o desenvolvimento de uma aplicao real em .Net para que voc adquira habilidades para a construo ou manuteno de aplicaes mais complexas. Conforme voc for evoluindo nos mdulos, ir adquirir conhecimentos sobre:

77

Microsoft Visual C# Comunicao entre as camadas; Vantagens do modelo de desenvolvimento em camadas; Controle de transaes do banco de dados com o ADO .Net; Construo de uma aplicao para Windows; Construo de uma aplicao para a Web; A importncia da segurana no desenvolvimento de aplicaes. A metodologia utilizada ser o desenvolvimento em trs camadas. Veremos a diferena entre: Camada de acesso dados ou Data Access Layer (DAL); Camada de regras de negcio ou Business Logic Layer (BLL); e Camada de interface do usurio ou User Interface (UI).

78

Microsoft Visual C#

Na camada de interface com o usurio reutilizaremos as camadas DAL e BLL para criarmos dois projetos de interface para o usurio. Um projeto ser uma aplicao que rodar no Microsoft Windows e o outro ser uma aplicao para a Web. Esse passo-a-passo ser usado como exemplos prticos da utilizao de

conceitos como: programao orientada a objetos, integridade referencial de banco de dados, uso de transaes via linguagem de programao C# .Net e implementao de algoritmos de segurana no desenvolvimento de aplicaes. Esse projeto ser desenvolvido utilizando os softwares: Microsoft Windows XP Professional com Microsoft SQL Server 2005 utilizando o Microsoft Visual Studio 2008.

79

Microsoft Visual C# a. Criando a infra-estrutura de Banco de dados Para o nosso projeto vamos precisar de uma infra-estrutura simples de banco de dados com apenas trs tabelas: clientes, produtos e vendas. Se voc estiver utilizando o MS SQL Server 2005, poder abrir o Microsoft SQL Server Management Studio. Selecione o servidor de banco de dados e o usurio para realizar a conexo como a seguir:

Estabelecida a conexo, podemos criar um banco de dados para o nosso projeto. Para isso, clique com o boto direito sobre Databases e escolha a opo New Database...

80

Microsoft Visual C#

Vamos dar o nome do nosso database de Loja. Deixe a configurao padro para o tamanho inicial dos arquivos de dados e Log. Clique em Ok para criar o database:

Aps clicar em Ok provavelmente precisaremos aguardar alguns segundos para que o MS SQL Server 2005 crie o banco de dados Loja.

81

Microsoft Visual C# Quando esta janela de ttulo New Database desaparecer, podemos verificar que o banco de dados Loja foi criado com sucesso conforme figura abaixo:

Agora que j temos o nosso banco de dados, vamos executar os scripts para criar as trs tabelas necessrias ao nosso projeto. b. Criando a tabela de Clientes Clicando com o boto direito sobre o database Loja, escolha a opo New Query:

82

Microsoft Visual C# Digite o script SQL abaixo na janela de Query aberta. CREATE TABLE [CLIENTES] ( [CODIGO] [int] IDENTITY (1, 1) NOT NULL , [NOME] [varchar] (100) , [EMAIL] [varchar] (100) , [TELEFONE] [varchar] (80) , CONSTRAINT [PK_CLIENTES] PRIMARY KEY CLUSTERED ( [CODIGO] ) ON [PRIMARY] ) ON [PRIMARY] GO O cdigo dever ficar assim:

Para executar esse script e criar a tabela de Clientes, clique no boto Execute: Se a mensagem Command(s) completed successfully. for exibida, podemos expandir o database Loja e depois expandir Tables para vermos a tabela CLIENTES que acabamos de criar.

83

Microsoft Visual C#

O campo Cdigo da nossa tabela de Clientes foi criado como Identity e Primary Key. O que significa isso? Bem, Primary key (chave primria) um campo que ser nico para cada registro da tabela, ou seja, s existir um campo com o cdigo igual a 1, s existir um campo com o cdigo igual a 2 etc. um campo que no admite valores repetidos. Se tentarmos incluir um valor na chave primria j existente na tabela, o MS SQL Server vai exibir uma mensagem de erro e no permitir essa incluso. A caracterstica Identity desse campo significa que ele ser gerenciado pelo MS SQL Server e ns no precisamos nos preocupar em inserir um valor inexistente na tabela para evitar a duplicidade. Na prtica isso quer dizer que ns nem precisamos mencionar esse campo nas operaes de insero pois o gerenciador de banco de dados que se encarrega de inserir uma chave primria vlida. Vamos inserir um registro na tabela de clientes com o comando a seguir. Salve o script que acabou de criar em uma pasta de sua preferncia e fecheo. Abra uma nova janela do Query e digite o comando abaixo: insert into clientes(nome,email,telefone) values ('Carlos Camacho','c_olavo@hotmail.com','(11) 9999-5555') Clique em Execute para executar o comando de insero:

84

Microsoft Visual C#

Se a mensagem 1 row(s) affected for exibida, significa que o registro foi inserido com sucesso. Execute o comando de seleo a seguir para visualizarmos o registro que acabamos de inserir na tabela de Clientes: Select * from clientes

Perceba que apesar de no mencionarmos o campo Codigo no comando de insert executado anteriormente, o MS SQL Server providenciou a insero desse valor automaticamente. Se executarmos outro comando de insert, o MS SQL Server vai gerar um cdigo diferente para inserir no campo Codigo do novo registro.

85

Microsoft Visual C# Parabns! Acabamos de preparar a infra-estrutura do nosso projeto com a tabela de Clientes criada corretamente. Agora vamos executar o script para criar a tabela de produtos. O processo o mesmo. Abra uma nova janela de query e digite o script abaixo. No se esquea de salvar o script anterior. CREATE TABLE [PRODUTOS] ( [CODIGO] [int] IDENTITY (1, 1) NOT NULL , [NOME] [varchar] (100) , [PRECO] decimal(10,2) , [ESTOQUE] [int] , CONSTRAINT [PK_PRODUTOS] PRIMARY KEY CLUSTERED ( [CODIGO] ) ON [PRIMARY] ) ON [PRIMARY] GO Com o script na janela de query, clique em Executar para criarmos a tabela de produtos.

86

Microsoft Visual C#

Depois que voc clicou no Execute apareceu a mensagem Command(s) completed successfully., mas a tabela PRODUTOS no apareceu em Tables. Precisamos atualizar o Management Studio para ver a tabela recm-criada. Para isso, vamos clicar com o boto direito do mouse em Tables e escolher a opo Refresh:

Veja o Management Studio aps o Refresh:

Agora podemos ver a tabela de Produtos.

87

Microsoft Visual C# Agora ns vamos inserir dois produtos nessa tabela. Abra uma nova janela de query e digite o cdigo abaixo. Feito isso clique em Execute para a insero dos dois produtos. insert into produtos (nome, preco, estoque) values ('Computador Pentium Dual Core','1500.00','15') insert into produtos (nome, preco, estoque) values ('Impressora Deskjet HP','599.90','150') Vamos ver o resultado:

Na janela de mensagens podemos ver que os dois registros foram inseridos com sucesso. Utilize o comando select para consultar os produtos cadastrados. Abra uma nova janela do query e digite o comando abaixo e clique em Execute. select * from produtos

88

Microsoft Visual C# O resultado esse:

Agora

ns

temos

dois

produtos

cadastrados.

Cadastraremos

10

equipamentos com valores e descrio diferentes. Agora a nossa tabela de Produtos est pronta s falta criarmos a tabela de Vendas! Para criar a tabela para armazenar as Vendas, abra uma nova janela de query e digite o comando abaixo e clique em Execute. CREATE TABLE [VENDAS] ( [CODIGO] [int] IDENTITY (1, 1) NOT NULL , [DATA] [datetime], [QUANTIDADE] [int], [FATURADO] bit, [CODIGOCLIENTE] [int], [CODIGOPRODUTO] [int], CONSTRAINT [PK_VENDAS] PRIMARY KEY CLUSTERED ( [CODIGO] ) ON [PRIMARY], CONSTRAINT [FK_Codigo_Cliente] FOREIGN KEY

89

Microsoft Visual C# ( [CODIGOCLIENTE] ) REFERENCES [Clientes] ( [Codigo] ), CONSTRAINT [FK_Codigo_Produto] FOREIGN KEY ( [CODIGOPRODUTO] ) REFERENCES [Produtos] ( [Codigo] ) ) ON [PRIMARY] GO Vejamos o resultado:

90

Microsoft Visual C# D um Refresh clicando com o boto direito tem Tables para que a tabela de Vendas seja exibida:

A tabela de Vendas que acabamos de criar possui duas foreign keys (chaves estrangeiras). Essas duas chaves so os campos: CodigoCliente e CodigoProduto. Isso significa que quando um registro for inserido nesta tabela, o campo CodigoCliente includo dever existir na tabela de Clientes, assim como o campo CodigoProduto dever existir na tabela Produtos. Se algum tentar incluir valores nestes campos que no existam nas tabelas citadas o Microsoft SQL Server vai informar a ocorrncia de um erro e no permitir a incluso. Esse mecanismo do sistema gerenciador de banco de dados existe para manter a integridade dos dados. Chamamos isso de integridade referencial. Uma regra que vamos usar no nosso projeto que ao realizar uma venda, atualizaremos o estoque do produto na tabela de Produtos. Faremos com que o estoque fique atualizado com a seguinte frmula: Estoque = Estoque Quantidade Vendida . Essa tarefa ser realizada juntamente com a tarefa de incluso da Venda na tabela de Vendas.

91

Microsoft Visual C# Assim, para manter a integridade dos dados, precisaremos garantir que as duas coisas aconteam: a incluso na tabela de Vendas e a atualizao do estoque na tabela de Produtos. Para isso usaremos uma Transao. Com a transao podemos garantir a execuo das duas tarefas. Se uma delas for bem sucedida e a outra falhar, a transao desfaz a primeira tarefa mantendo assim a integridade referencial. Em outras palavras, no exisitir na tabela de Vendas um registro que tenha o cdigo do produto vendido mas que o estoque deste produto na tabela de Produtos esteja desatualizado. Veremos isso com mais detalhes nas prximas definies em Camada de Acesso a Dados (Data Access Layer). Implementaremos as classes de acesso a dados e faremos esse controle transacional no mtodo Incluir da classe de Vendas. Para futura utilizao no nosso projeto, precisaremos guardar as seguintes informaes sobre o banco de dados: Nome do servidor de banco de dados que estamos usando; Nome do banco de dados onde as trs tabelas foram criadas; Nome do usurio e senha utilizados para acessar o banco de dados. Essa informao importante para a construo da nossa string de conexo ou connectionstring. A connectionstring ser usada para a conexo com o banco de dados atravs da aplicao que desenvolveremos neste projeto. Um bom site para consulta sobre a correta connectionstring que devemos utilizar o http://www.connectionstrigs.com/. Neste site existem dicas para criar connectionstrings para diferentes verses de bancos de dados. No nosso caso, se fecharmos a janela de Query que estvamos usando, poderei ver o nome do servidor de banco de dados que estamos usando, conforme demonstra a figura a seguir.

92

Microsoft Visual C#

Abaixo segue informaes para conexo com nosso servidor do SQL Server Express. Nome do Servidor: MAQ-607567\SQLEXPRESS Nome do banco de dados: Loja Usurio: ittraining Senha: csharp Assim, a nossa connectionstring ficar assim: "server=MAQ607567\SQLEXPRESS;database=Loja;user=ittraining;pwd=csharp" A sua connectionstring vai depender dos nomes que voc usou para: - Criar o servidor de banco de dados; - Criar o banco de dados; - Criar usurio e senha que tero acesso ao banco de dados. c. Camada de Acesso a Dados Essa camada normalmente tambm chamada de DAL (Data Access Layer). Nessa camada vamos implementar os mtodos de insero, atualizao, excluso e listagem referentes a todas as tabelas existentes no nosso projeto. Essa uma tarefa simples, j que para criar cada classe usaremos os nomes dos campos da respectiva tabela existente no banco de dados.

93

Microsoft Visual C# Voc se lembra do nosso desenho que representa as trs camadas? Aqui est ele:

Ns comeamos o desenvolvimento da aplicao da camada mais interna at a mais externa. Dessa forma, iniciaremos a implementao com a camada de acesso a dados (DAL). Dentro da camada DAL ns temos o projeto Modelos. Agora vamos criar um projeto chamado Modelos iremos implementar as classes: ClienteInformation.cs ProdutoInformation.cs e VendaInformation.cs necessrio criar uma classe para cada tabela do nosso projeto.

94

Microsoft Visual C# A partir do menu Iniciar > Programas > Microsoft Visual Studio 2008, abra o Microsoft Visual Studio 2008. Clique no Menu File > New > Project...

Acompanhe as selees da janela New Project:

No tipo de projeto selecione Visual C#; No tipo de template selecione Class Library; No Nome do projeto digite Modelos;

95

Microsoft Visual C# Na localizao do projeto digite C:\Loja; Deixe a opo Create directory for solution selecionada e clique em Ok para criar o projeto. Abrindo o Windows Explorer, podemos ver que a pasta Loja foi criada no drive C: Dentro da pasta Loja foi criada a pasta do projeto Modelos.

Ok, agora vamos voltar para o MS Visual Studio e do lado direito vemos a rea do Solution Explorer. Clique com o boto direito sobre o arquivo Class1.cs e escolha Rename para renomear a classe para ClienteInformation.cs. Ao renomear o arquivo da classe, perceba que o nome da classe muda automaticamente na janela de cdigo (public class ClienteInformation). Na janela de cdigo esquerda, inclua o nome do nosso projeto (Loja) no namespace, de maneira que o namespace fique Loja.Modelos como na figura a seguir.

96

Microsoft Visual C#

Vamos codificar a classe ClienteInformation. Para isso, digite o cdigo abaixo entre as chaves da classe ClienteInformation: private int _codigo; public int Codigo { get { return _codigo; } set { _codigo = value; } } private string _nome; public string Nome { get { return _nome; } set { _nome = value; } } private string _email; public string Email { get { return _email; } set { _email = value; } } private string _telefone; public string Telefone { get { return _telefone; } set { _telefone = value; } } Na implementao da classe ClienteInformation vemos que estamos definindo campos e propriedades para cada campo da tabela de Clientes que criamos no banco de dados.

97

Microsoft Visual C# Agora a codificao da classe ClienteInformation est completa como na listagem a seguir: using System; using System.Collections.Generic; using System.Text; namespace Loja.Modelos { public class ClienteInformation { private int _codigo; public int Codigo { get { return _codigo; } set { _codigo = value; } } private string _nome; public string Nome { get { return _nome; } set { _nome = value; } } private string _email; public string Email { get { return _email; } set { _email = value; } } private string _telefone; public string Telefone { get { return _telefone; } set { _telefone = value; } } } } Vamos implementar a Classe ProdutoInformation.cs. Clique com o boto direito sobre o projeto Modelos e ento escolha Add. Em seguida escolha New Item... como na figura abaixo:

98

Microsoft Visual C# Na janela Add New Item, escolha o template Class e digite

ProdutoInformation.cs no campo nome. Clique em Add para adicionar a nova classe ao projeto Modelos.

A nova classe ProdutoInformation.cs agora j esta criada:

99

Microsoft Visual C# Altere o namespace de modo que ele fique assim: namespace Loja.Modelos Ok. Agora copie e cole o cdigo abaixo dentro da classe ProdutoInformation: private int _codigo; public int Codigo { get { return _codigo; } set { _codigo = value; } } private string _nome; public string Nome { get { return _nome; } set { _nome = value; } } private decimal _preco; public decimal Preco { get { return _preco; } set { _preco = value; } } private int _estoque; public int Estoque { get { return _estoque; } set { _estoque = value; } } O cdigo completo da nossa classe ProdutoInformation.cs ficar assim: using System; using System.Collections.Generic; using System.Text; namespace Loja.Modelos { public class ProdutoInformation { private int _codigo; public int Codigo { get { return _codigo; } set { _codigo = value; } } private string _nome; public string Nome { get { return _nome; } set { _nome = value; } } private decimal _preco; public decimal Preco { get { return _preco; } set { _preco = value; } } private int _estoque; public int Estoque { get { return _estoque; } set { _estoque = value; } } } }

100

Microsoft Visual C# Muito bem, j implementamos as classes do projeto Modelo para a tabela de Clientes e para a tabela de Produtos. Agora vamos fazer o mesmo para a tabela de Vendas: Clique com o boto direito sobre o projeto Modelos e ento escolha Add. Em seguida escolha New Item... como na figura abaixo:

Na

janela

Add

New

Item,

escolha

template

Class

digite

VendaInformation.cs no campo nome. Clique em Add para adicionar a nova classe ao projeto Modelos.

101

Microsoft Visual C# A nova classe VendaInformation.cs agora j esta criada:

Altere o namespace de modo que ele fique assim: namespace Loja.Modelos Ok. Agora copie e cole o cdigo abaixo dentro da classe VendaInformation: private int _codigo; public int Codigo { get { return _codigo; } set { _codigo = value; } } private DateTime _data; public DateTime Data { get { return _data; } set { _data = value; } } private int _quantidade; public int Quantidade { get { return _quantidade; } set { _quantidade = value; } } private bool _faturado; public bool Faturado {

102

Microsoft Visual C# get { return _faturado; } set { _faturado = value; } } private int _codigoCliente; public int CodigoCliente { get { return _codigoCliente; } set { _codigoCliente = value; } } private int _codigoProduto; public int CodigoProduto { get { return _codigoProduto; } set { _codigoProduto = value; } } private string _nomeCliente; public string NomeCliente { get { return _nomeCliente; } set { _nomeCliente = value; } } O cdigo completo da nossa classe VendaInformation.cs ficar assim: using System; using System.Collections.Generic; using System.Text; namespace Loja.Modelos { public class VendaInformation { private int _codigo; public int Codigo { get { return _codigo; } set { _codigo = value; } } private DateTime _data; public DateTime Data { get { return _data; } set { _data = value; } } private int _quantidade; public int Quantidade { get { return _quantidade; } set { _quantidade = value; } } private bool _faturado; public bool Faturado { get { return _faturado; } set { _faturado = value; } } private int _codigoCliente; public int CodigoCliente { get { return _codigoCliente; } set { _codigoCliente = value; } } private int _codigoProduto; public int CodigoProduto { get { return _codigoProduto; } set { _codigoProduto = value; } } private string _nomeCliente;

103

Microsoft Visual C# public string NomeCliente { get { return _nomeCliente; } set { _nomeCliente = value; } } } } Agora que implementamos no projeto Modelos as classes referentes a todas as tabelas contempladas no nosso projeto, vamos compilar o projeto atravs da opo Build. Para compilar o projeto vamos fazer o seguinte. No Solution Explorer, clique com o boto direito sobre o projeto Modelos e escolha a opo Build:

Se a compilao do nosso projeto for realizada com sucesso, aparecer a mensagem Build succeeded na barra de status do Microsoft Visual Studio conforme figura a seguir.

104

Microsoft Visual C#

No Windows Explorer, observe que na pasta do projeto Modelos foi criado um arquivo para cada classe que implementamos.

Quando compilamos o projeto com a opo Build, o MS Visual Studio criou o arquivo Modelos.dll. O arquivo Modelos.dll contm toda a informao que implementamos nas classes desse projeto e ele que ser usado no prximo projeto a ser implementado, que a Camada de Acesso a Dados ou DAL (Data Access Layer).

105

Microsoft Visual C#

Aps terminar o projeto Modelos, muitos programadores costumam criar um Diagrama de Classes para ter uma viso melhor do seu projeto ento agora vamos criar o Diagrama de Classe. De volta ao Visual Studio, clique com o boto direito sobre o projeto Modelos e escolha Add > New Item...

Na janela Add New Item, escolha o template Class Diagram. Digite Modelos.cd no nome e clique em Add para criar o nosso diagrama de classes como a seguir.

106

Microsoft Visual C#

O ambiente chamado Class Designer exibido.

Para a criao do diagrama vamos arrastar as classes ClienteInformation, ProdutoInformation e VendaInformation do Solution Explorer para o Class Designer (Arquivo Modelos.cd) como a seguir:

107

Microsoft Visual C#

Com o Diagrama de Classes fica fcil a distino entre os campos e as propriedades que implementamos no nosso projeto. O asterisco ao lado do nome do diagrama Modelos.cd* indica que ele ainda no foi salvo. Digite <Ctrl> + S para salvar o arquivo. d. Implementar as classes da Camada DAL (Data Access Layer). J criamos as classes referente aos Modelos, agora iremos criar as as classes que pertencem a camada de dados. Iremos criar um novo projeto chamado DAL e dentro dele adicionar as seguintes classes: ClientesDAL.cs ProdutosDAL.cs VendasDAL.cs Dados.cs Voc ver que a classe ClientesDAL, por exemplo, conter os mtodos de incluso, alterao, excluso e consulta referentes a tabela de Clientes. O mesmo ocorrer para as classes ProdutosDAL e VendasDAL.

108

Microsoft Visual C# Usaremos a classe Dados para armazenarmos a string de conexo com o banco de dados. Para comear voc deve abrir nosso projeto de Modelos que criamos no item anterior. - Vamos adicionar um novo projeto. No menu File do Visual Studio, clique em Add > New Project...

Na janela Add New Project: - Escolha Visual C# para o tipo de projeto; - Class Library para o template; - Digite DAL no campo nome; - Digite C:\Loja\DAL na localizao; - Clique em Ok para adicionar o novo projeto nossa Solution (soluo). Nota: Quando temos um conjunto de projetos reunidos para atender uma necessidade chamamos esse conjunto de Solution.

109

Microsoft Visual C#

Agora o nosso projeto DAL foi adicionado nossa Solution conforme mostra a figura a seguir.

110

Microsoft Visual C# O nome da nossa Solution est como Modelos porque o MS Visual Studio usa o nome do primeiro projeto criado. No Solution Explorer, clique com o boto direito sobre a Solution Modelos e escolha a opo Rename. Renomeie a Solution para Loja. Depois que voc renomear a nossa Solution, ela ficar assim:

No projeto DAL, renomeie a classe Class1.cs para ClientesDAL.cs e altere o namespace para namespace Loja.DAL.

111

Microsoft Visual C# A nossa classe ClientesDAL ficar assim:

Voc

se

lembra

quando

comentamos

que

nossa

implementao

aconteceria da camada mais interna para a mais externa do desenho do nosso projeto? Abaixo segue a ordem em que os projetos sero criados. [Modelos] DAL BLL - User Interface O projeto Modelos o mais interno e o prximo a camada de acesso a dados DAL. Isso significa que o nosso projeto DAL poder usar tudo o que j foi construdo no projeto Modelos.

112

Microsoft Visual C# Em termos de programao, dizemos que o projeto DAL faz referncia ao projeto Modelos. Para que o nosso projeto DAL consiga ver o que j construmos no projeto Modelos, vamos criar essa referncia. Abra a pasta References do projeto DAL para ver o que j existe como referncia sempre que criamos um novo projeto:

Precisamos incluir no projeto DAL uma referncia para o Modelos. Faa o da seguinte forma. Clique com o boto direito na pasta References do projeto DAL e escolha Add Reference conforme mostra a figura a seguir.

113

Microsoft Visual C#

Na janela Add Reference que abrir, clique na aba Projects:

114

Microsoft Visual C# Veremos o nosso projeto Modelos. Clique sobre ele para selecion-lo e ento clique em Ok para criar a referncia.

Muito bom, agora j podemos ver a referncia para o nosso projeto Modelos dentro do nosso projeto DAL como a seguir:

115

Microsoft Visual C# Para enxergar os Modelos dentro da nossa classe ClientesDAL vamos adicionar a clusula using como segue:

Aps digitarmos using Loja. (coloque o ponto aps digitar Loja) perceba que o MS Visual Studio j nos mostra as referncias disponveis. Com as setas de direo posicione a seleo em Modelos e d um ENTER para selecion-lo.

116

Microsoft Visual C#

Aquele tracinho vermelho aps Loja.Modelos indica que h algo errado. o comando using que no foi fechado. Para fech-lo devemos digitar ;. Ento digite ponto-e-vrgula ( ; ) para fechar o comando using:

117

Microsoft Visual C#

Para que tenhamos acesso as definies do namespace do MS SQL Server, vamos inserir mais uma clusula using para System.Data.SqlClient como a seguir:

118

Microsoft Visual C#

Para o cdigo da classe ClientesDAL digite o cdigo abaixo entre as chaves da classe: public void Incluir(ClienteInformation cliente) { //conexao SqlConnection cn = new SqlConnection(); try { cn.ConnectionString = Dados.StringDeConexao; //command SqlCommand cmd = new SqlCommand(); cmd.Connection = cn; cmd.CommandText = "insert into Clientes(nome,email,telefone) values (@nome,@email,@telefone); select @@IDENTITY;"; cmd.Parameters.AddWithValue("@nome", cliente.Nome); cmd.Parameters.AddWithValue("@email", cliente.Email); cmd.Parameters.AddWithValue("@telefone", cliente.Telefone); cn.Open(); cliente.Codigo = Convert.ToInt32(cmd.ExecuteScalar()); } catch (SqlException ex) { throw new Exception("Servidor SQL Erro:" + ex.Number);

119

Microsoft Visual C# } catch (Exception ex) { throw new Exception(ex.Message); } finally { cn.Close(); } } public void Alterar(ClienteInformation cliente) { // conexao SqlConnection cn = new SqlConnection(); try { cn.ConnectionString = Dados.StringDeConexao; SqlCommand cmd = new SqlCommand(); cmd.Connection = cn; cmd.CommandType = CommandType.Text; cmd.CommandText = "update Clientes set nome = @nome, email = @email, telefone = @telefone where codigo = @codigo;"; cmd.Parameters.AddWithValue("@codigo", cliente.Codigo); cmd.Parameters.AddWithValue("@nome", cliente.Nome); cmd.Parameters.AddWithValue("@email", cliente.Email); cmd.Parameters.AddWithValue("@telefone", cliente.Telefone); cn.Open(); cmd.ExecuteNonQuery(); } catch (SqlException ex) { throw new Exception("Servidor SQL Erro:" + ex.Number); } catch (Exception ex) { throw new Exception(ex.Message); } finally { cn.Close(); } } public void Excluir(int codigo) { //conexao SqlConnection cn = new SqlConnection(); try { cn.ConnectionString = Dados.StringDeConexao; //command SqlCommand cmd = new SqlCommand(); cmd.Connection = cn; cmd.CommandText = "delete from Clientes where codigo = " + codigo; cn.Open(); int resultado = cmd.ExecuteNonQuery(); if (resultado != 1) { throw new Exception("No foi possvel excluir o cliente " + codigo); } } catch (SqlException ex) { throw new Exception("Servidor SQL Erro:" + ex.Number); } catch (Exception ex) { throw new Exception(ex.Message); } finally { cn.Close(); } } public DataTable Listagem() { DataTable tabela = new DataTable(); SqlDataAdapter da = new SqlDataAdapter("select * from clientes", Dados.StringDeConexao);

120