bem vindo ao curso c

16
Bem vindo ao curso C# e Orientação a Objetos da Caelum. Nesse curso, aprenderemos como utilizar conceitos de orientação a objetos junto com uma das linguagens de programação mais poderosas para desenvolver sistemas complexos e de fácil manutenção. Antes de começarmos o curso, configuraremos o ambiente de desenvolvimento. Entre no site http://www.microsoft.com/visualstudio/eng/downloads#d-2010-express, escolha a opção Visual C# 2010 Express e em seguida no link Install Now. O navegador fará automaticamente o download do instalador do Visual C# 2010 Express Edition. Na janela inicial, clique no botão next para começar o processo de instalação. No próximo passo, o instalador nos informa quais são os componentes do Visual C# que serão instalados no computador.

Upload: tiagoluizchaves

Post on 08-Dec-2015

224 views

Category:

Documents


1 download

DESCRIPTION

curso C#

TRANSCRIPT

Page 1: Bem Vindo Ao Curso C

Bem vindo ao curso C# e Orientação a Objetos da Caelum. Nesse curso, aprenderemos como utilizar conceitos de orientação a objetos junto com uma das linguagens de programação mais poderosas para desenvolver sistemas complexos e de fácil manutenção. Antes de começarmos o curso, configuraremos o ambiente de desenvolvimento. Entre no site http://www.microsoft.com/visualstudio/eng/downloads#d-2010-express, escolha a

opção Visual C# 2010 Express e em seguida no link Install Now. O navegador fará

automaticamente o download do instalador do Visual C# 2010 Express Edition. Na janela inicial, clique no botão next para começar o processo de instalação.

No próximo passo, o instalador nos informa quais são os componentes do Visual C# que serão instalados no computador.

Page 2: Bem Vindo Ao Curso C

Quando clicarmos no botão next, o instalador começará a fazer o download e a instalação do Visual C#

Page 3: Bem Vindo Ao Curso C

Agora a instalação está concluída!

O primeiro programa em C# Agora que já instalamos o Visual C#, vamos criar nossa primeira aplicação.

Abra o Visual C# 2010 e aperte Ctrl+Shift+N.

Page 4: Bem Vindo Ao Curso C

Na janela de novo projeto, escolha a opção Windows Forms Application e dê um nome para

o seu projeto inicial. O Visual Studio criará automaticamente um projeto com uma janela vazia.

Queremos inicialmente colocar um botão no formulário que, quando clicado, abrirá uma caixa de mensagem do Windows.

Para criar o botão, precisamos apenas usar o atalho Ctrl+W, X e arrastar um button para o

formulário.

Page 5: Bem Vindo Ao Curso C

Agora dê um clique duplo no botão que acabamos de adicionar para programarmos o que deve acontecer quando o botão for clicado. O Visual Studio abrirá o código do formulário. Não se preocupe com todo o código complicado que está escrito nesse arquivo, entenderemos o significado de cada uma dessas linhas mais a frente no curso.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;

namespace form { public partial class Form1 : Form { public Form1() { InitializeComponent(); }

Page 6: Bem Vindo Ao Curso C

15

16

17

18

19

20

21

22

23

private void button1_Click(object sender, EventArgs e) { } } }

O trecho de código que nos interessa no momento é:

1

2

3

private void button1_Click(object sender, EventArgs e) { }

Todo código que for colocado dentro das chaves será executado quando o botão for clicado. No clique do botão, queremos executar o comando que mostra uma caixa de mensagens para o usuário.

1 MessageBox.Show(mensagem)

No C#, todo comando deve ser terminado pelo caractere ';'. Portanto, o código para mostrar a caixa de mensagem fica da seguinte forma:

1 MessageBox.Show(mensagem);

Queremos que, ao clicar no botão, a mensagem Hello World seja exibida em uma caixa de

mensagens. Então, utilizaremos o seguinte código:

1

2

3

4

private void button1_Click(object sender, EventArgs e) { MessageBox.Show(Hello World); }

Como a mensagem é somente um texto, o compilador do C# nos força a colocá-la entre aspas duplas. Portanto, o código do clique do botão ficará assim:

1

2

3

4

private void button1_Click(object sender, EventArgs e) { MessageBox.Show("Hello World"); }

O código completo fica da seguinte forma:

1

2

3

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data;

Page 7: Bem Vindo Ao Curso C

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;

namespace form { public partial class Form1 : Form { public Form1() { InitializeComponent(); }

private void button1_Click(object sender, EventArgs e) { MessageBox.Show("Hello World"); } } }

Não se preocupe com as linhas de código que não foram explicadas. Entenderemos o que elas

fazem durante o curso.

Aperte F5 para executar o código do formulário. O resultado deve ser algo parecido com a

imagem abaixo:

Na maioria dos programas que escrevemos, não estamos interessados em apenas mostrar uma caixa de mensagens para o usuário. Queremos também armazenar e processar informações. Em um sistema bancário, por exemplo, estaríamos interessados em armazenar o saldo de uma conta e o nome do correntista. Para armazenar esses dados, precisamos pedir para o C# reservar regiões de memória que serão utilizadas para armazenar informações. Essas regiões de memória são conhecidas como variáveis.

Page 8: Bem Vindo Ao Curso C

As variáveis guardam informações de um tipo específico. Podemos, por exemplo, guardar um número inteiro representando o número da conta, um texto para representar o nome do correntista ou um número real para representar o saldo atual da conta. Para utilizar uma variável, devemos primeiramente declará-la no texto do programa. Na declaração de uma variável, devemos dizer seu tipo (inteiro, texto ou real, por exemplo) e, além disso, qual é o nome que usaremos para referenciá-la no texto do programa. Para declarar uma variável do tipo inteiro que representa o número de uma conta, utilizamos o seguinte código:

1 int numeroDaConta;

Repare no ';' no final da linha. Como a declaração de uma variável é um comando da linguagem C#, precisamos do ';' para terminá-lo. Além do tipo int (para representar inteiros), temos também os tipos double e float (para números reais), string (para textos), entre outros. Depois de declarada, uma variável pode ser utilizada para armazenar valores. Por exemplo, se estivéssemos interessados em guardar o valor 1 na variável "numeroDaConta" que declaramos anteriormente, utilizaríamos o seguinte código:

1 numeroDaConta = 1;

Lê-se "numeroDaConta recebe 1". Quando, no momento da declaração da variável, sabemos qual será seu valor, podemos utilizar a seguinte sintaxe para declarar e atribuir o valor para a variável.

1 double saldo = 100.0;

Operações com variáveis Agora que já sabemos como guardar informações no programa, estamos interessados em executar operações nesses valores. Pode ser interessante para um correntista saber qual será o saldo de sua conta após um saque de 10 reais. Para realizar essa operação, devemos subtrair 10 reais do saldo da conta:

1

2

double saldo = 100.0; double valorAposOSaque = saldo - 10.0;

Podemos ainda guardar o valor do saque em uma variável:

1

2

3

double saldo = 100.0; double valorDoSaque = 10.0; double valorAposSaque = saldo - valorDoSaque;

Page 9: Bem Vindo Ao Curso C

Depois de realizar o saque, queremos mostrar para o usuário qual é o saldo atual da conta. Para

mostrarmos essa informação, utilizaremos novamente o MessageBox.Show: 1 MessageBox.Show("O saldo da conta após o saque é: " + valorAposSaque);

Tomando decisões no código Voltando para nosso exemplo de aplicação bancária, queremos permitir um saque somente se o valor a ser retirado for menor ou igual ao saldo da conta, ou seja, se o saldo da conta for maior ou igual ao valor do saque, devemos permitir a operação, senão não podemos permitir o saque. Precisamos fazer execução condicional de código.

No C#, podemos executar código condicional utilizando a construção if:

1

2

3

4

if (condicao) { // Esse código será será executado somente se a condição for verdadeira }

No nosso exemplo, queremos executar a lógica de saque apenas se o saldo for maior ou igual ao valor do saque:

1

2

3

4

5

6

double saldo = 100.0; double valorSaque = 10.0; if (saldo >= valorSaque) { // código do saque. }

O código do saque deve diminuir o saldo da conta e mostrar uma mensagem para o usuário indicando que o saque ocorreu com sucesso:

1

2

3

4

5

6

7

double saldo = 100.0; double valorSaque = 10.0; if (saldo >= valorSaque) { saldo = saldo - valorSaque; MessageBox.Show("Saque realizado com sucesso"); }

Repare que, se a conta não tiver saldo suficiente para o saque, o usuário não é avisado. Então estamos na seguinte situação: "Se a conta tiver saldo suficiente, quero fazer o saque, senão, quero mostrar a mensagem Saldo Insuficiente para o usuário". Para fazer isso, podemos usar

o else do C#:

1

2

3

4

5

6

7

if (saldo >= valorSaque) { // código do saque } else { MessageBox.Show("Saldo Insuficiente"); }

Page 10: Bem Vindo Ao Curso C

8

Mais sobre condições

Repare na expressão que passamos para o if: saldo >= valorSaque. Nele utilizamos o

operador "maior ou igual". Além dele, há outros operadores de comparação que podemos utilizar: maior (>), menor (<), menor ou igual (<=), igual (==) e diferente (!=). E ainda existem mais opções

que podemos passar como condição para o if.

Na aula anterior, vimos que um valor tem um tipo associado em C#: 10 é um int, "mensagem" é

uma string. Da mesma forma, a expressão saldo >= valorSaque também tem um tipo

associado: o tipo bool, que pode assumir os valorestrue (verdadeiro) ou false (falso).

Podemos inclusive guardar um valor desse tipo numa variável:

1 bool podeSacar = (saldo >= valorSaque);

Também podemos realizar algumas operações com valores do tipo bool. Podemos, por

exemplo, verificar se duas condições são verdadeiras ao mesmo tempo usando o

operador && (AND):

1 bool realmentePodeSacar = (saldo >= valorSaque) && (valorSaque > 0);

Assim, podemos construir condições mais complexas para um if. Por exemplo, podemos usar a

variávelrealmentePodeSacar declarada acima no if que verifica se o cliente pode sacar ou

não:

1

2

3

4

5

6

7

8

if (realmentePodeSacar) { // código do saque } else { MessageBox.Show("Saldo Insuficiente"); }

Repetindo um bloco de código De volta ao exemplo da aula anterior, suponha agora que o cliente desse mesmo banco queira saber quanto ele ganhará, ao final de 1 ano, caso ele invista um valor fixo todo mês. O investimento paga 1% do valor investido ao mês. Por exemplo, se o cliente investir R$ 1000,00, ao final de 12 meses, terá por volta de R$ 1126,82: no primeiro mês, R$ 1000,00 + R$1000,00 * 1% = R$ 1010,00; no segundo mês, R$ 1010,00 + R$1010,00 * 1% = R$ 1020,10; e assim por diante. Ou seja, para calcular o quanto ele terá ao final de um ano, podemos multiplicar o valor investido 12 vezes por 1%. Para resolvermos esse problema, precisamos fazer uso de uma estrutura de controle que repete

Page 11: Bem Vindo Ao Curso C

um determinado bloco de código até que uma condição seja satisfeita. Essa estrutura recebe o nome de loop.

Para fazer um loop no c#, utilizaremos, inicialmente, a instrução for. O for é uma instrução que

possui três partes: - A primeira parte é a inicialização, onde podemos declarar e inicializar uma variável que será utilizada no for; - A segunda parte é a condição do loop. Enquanto a condição do loop for verdadeira, o loop continuará executando; - A terceira parte é a atualização, onde podemos atualizar as variáveis que são utilizadas pelo for

Cada uma das partes do for é separada por um ;

1

2

3

4

for (inicialização; condição; atualização) { // Esse código será executado enquanto a condição for verdadeira }

Veja o código abaixo, por exemplo, onde usamos um for que repetirá o cálculo 12 vezes:

1

2

3

4

5

6

double valorInvestido = 1000.0; for (int i = 1; i <= 12; i += 1) { valorInvestido = valorInvestido * 1.01; } MessageBox.Show("Valor investido agora é " + valorInvestido);

Veja que nosso for começa inicializando a variável i com 1 e repete o código de dentro dele

enquanto o valor de i for menor ou igual a 12, ou seja, ele só para no momento em que i for

maior do que 12. E veja que, a cada iteração desse loop, o valor de i cresce (i += 1). No fim, o

código de dentro do for será repetido 12 vezes, como precisávamos.

O mesmo programa poderia ser escrito utilizando-se um while, em vez de um for:

1

2

3

4

5

6

7

8

double valorInvestido = 1000.0; int i = 1; while (i <= 12) { valorInvestido = valorInvestido * 1.01; i += 1; } MessageBox.Show("Valor investido agora é " + valorInvestido);

Neste momento, queremos representar diversas contas em nosso banco. Uma conta bancária é geralmente composta por um número, nome do titular e saldo. Podemos guardar essas informações em variáveis:

1

2

3

int numeroDaConta1 = 1; string titularDaConta1 = "Joaquim José"; double saldoDaConta1 = 1500.0;

Page 12: Bem Vindo Ao Curso C

Para representar outros correntistas, precisamos de novas variáveis:

1

2

3

int numeroDaConta2 = 2; string titularDaConta2 = "Silva Xavier"; double saldoDaConta2 = 2500.0;

Sempre que formos criar um novo correntista, precisamos lembrar de criar essas 3 variáveis. Então, por que não criamos um "modelo" para isso? Ou seja, dizemos apenas ao nosso programa que queremos criar uma "Conta" e ele se encarrega de criar essas 3 variáveis automaticamente? Para fazer isso, criaremos o que é conhecido por classe. Uma classe representa uma entidade, um conceito de domínio da nossa aplicação. Vamos representar uma Conta (em um arquivo Conta.cs). Ela tem número, nome do titular e saldo:

1

2

3

4

5

6

class Conta { public int numero; public string titular; public double saldo; }

Repare na sintaxe. Para cada atributo, definimos seu tipo e seu nome. Também precisamos colocar a palavra public na frente de cada atributo para que possamos acessá-lo de fora dessa classe.

Podemos agora criar infinitas Contas, e todas elas terão número, titular e saldo. Vamos

experimentar.

Para criar uma nova Conta, basta usarmos a palavra new e guardarmos o resultado em uma

variável:

1 Conta umaConta = new Conta();

Com essa instância de Conta em mãos (umaConta), podemos modificar os valores dos

atributos:

1

2

3

4

Conta umaConta = new Conta(); umaConta.numero = 1; umaConta.titular = "Joaquim José"; umaConta.saldo = 1500.0;

Se quisermos outra conta, basta repetir o procedimento:

1

2

3

4

Conta outraConta = new Conta(); outraConta.numero = 2; outraConta.titular = "Silva Xavier"; outraConta.saldo = 2500.0;

Muito mais prático! Resumindo, uma classe nos ajuda a centralizar todas as informações de

nossas entidades, facilitando a reutilização dela!

Page 13: Bem Vindo Ao Curso C

Veja como ficou a memória: temos dois objetos (ou instâncias) e duas referências

(umaConta e outraConta) que apontam para esses objetos. Repare que umaConta não é um

objeto, mas sim uma referência (uma seta) para o objeto! O objeto é o que está na memória.

Agora vamos analisar um outro exemplo: a transferência de dinheiro entre duas contas, isto é, pegar o dinheiro de uma instância e passar para a outra.

1

2

3

4

5

6

7

8

9

10

// criando duas contas Conta mauricio = new Conta(); Conta guilherme = new Conta(); mauricio.saldo = 1000.0; guilherme.saldo = 2000.0; // transferindo dinheiro entre elas double valorASerTransferido = 100.0; mauricio.saldo -= valorASerTransferido; guilherme.saldo += valorASerTransferido;

Veja que a implementação de uma transferência é bem simples! Agora, sempre que precisarmos transferir dinheiro em nosso sistema, basta colocarmos essas 3 linhas de código. Mas será que isso pode virar um problema? Sempre que precisarmos fazer uma transferência, são apenas 3 linhas de código! O problema aparece quando precisamos dar manutenção nesse código. Imagine que a regra de negócio mude e toda transferência passe a custar R$0,10. Ou seja, em uma transferência de R$ 10,00, a conta origem perderá R$ 10,10. Imagine em quantos pontos diferentes precisaremos mudar isso. Será que saberemos todos esses pontos? Será que os encontraremos de maneira fácil? Um bom design orientado a objetos é aquele que facilita as alterações, a sua manutenção. Uma solução para isso é colocar esse comportamento em algum lugar que seja fácil de ser

encontrado e de ser reutilizado. Um bom lugar para ele é dentro da própria classe Conta. Uma classe pode conter, além de atributos, métodos que manipulam esses atributos. Vamos começar por um comportamento mais simples: um saque. Em uma operação de saque,

devemos receber o valor a ser sacado. Veja o método Saca, dentro da classe Conta. Ele recebe

um parâmetro do tipo double:

1

2

3

4

5

6

7

8

9

10

class Conta { public int numero; public string titular; public double saldo;

public void Saca(double valorASerSacado) {

} }

O método Saca() deve tirar o valor recebido do saldo da conta:

Page 14: Bem Vindo Ao Curso C

1

2

3

public void Saca(double valorASerSacado) { this.saldo -= valorASerSacado; }

Repare o uso do this. Estamos dizendo que saldo é um atributo da classe. Observe também o

uso do public para que possamos chamar esse método em outros trechos de código. Vamos fazer uso desse nosso novo comportamento:

1

2

3

4

Conta mauricio = new Conta(); mauricio.saldo = 1000.0; mauricio.Saca(150.0); MessageBox.Show(mauricio.saldo); // imprimirá 850.0!

A instrução mauricio.Saca() invoca o método Saca() para a instância mauricio, ou seja, o

saque acontecerá nessa conta! Podemos sacar de outras contas também, de maneira análoga:

1 2

3

4

Conta guilherme = new Conta(); guilherme.saldo = 500.0; guilherme.Saca(100.0); MessageBox.Show(guilherme.saldo); // imprimirá 400.0!

Vamos ao próximo comportamento: depósito. Análogo ao método Saca(), devemos receber o

valor a ser depositado e somar esse valor no saldo da conta:

1

2

3

public void Deposita(double valorASerDepositado) { this.saldo += valorASerDepositado; }

O próximo comportamento é mais interessante. Vamos modelar uma operação de transferência. Para transferir, precisamos ter 2 contas em mãos: a conta de origem e a conta de destino. Uma primeira alternativa seria criar um método então que recebe 3 parâmetros: o valor a ser transferido, a conta origem e a conta destino:

1

2

3

public void Transfere(double valor, Conta origem, Conta destino) {

}

Mas, se fossemos utilizar esse método, faríamos algo como:

1

2

3

4

Conta mauricio = new Conta(); Conta guilherme = new Conta(); mauricio.Transfere(100, mauricio, guilherme);

Veja que repetimos a variável "mauricio" duas vezes. Como nossos métodos são sempre

disparados a partir de instâncias de objetos (mauricio.Transfere(..), por exemplo), não

precisamos da origem: a origem é o próprio objeto!

Page 15: Bem Vindo Ao Curso C

1

2

3

4

public void Transfere(double valor, Conta destino) { this.saldo -= valor; destino.saldo += valor; }

Veja o código acima: tiramos do saldo desse (this) objeto e repassamos para o outro. Para

experimentá-lo, podemos fazer:

1

2

3

4

Conta mauricio = new Conta(); Conta guilherme = new Conta();

mauricio.Transfere(100, guilherme);

Podemos melhorar ainda mais esse código. Veja que acabamos de escrever um trecho de código

repetido, pois a linhathis.saldo -= valor; é exatamente o método Saca(). Vamos

reutilizar esses métodos:

1

2

3

4

public void Transfere(double valor, Conta destino) { this.Saca(valor); destino.Deposita(valor); }

Veja que agora estamos produzindo código orientado a objetos. Dados e comportamentos devem

viver perto. Se um dia a regra de negócio de transferência mudar, mudaremos apenas dentro do

método Transfere(), e essa mudança será automaticamente propagada para todas as

transferências.

Quando abrimos uma conta no banco, temos que fornecer uma série de informações: nome, cpf, rg e

endereço.

Vimos que quando queremos armazenar informações em uma classe, devemos criar atributos. Mas em qual

classe colocar esses novos atributos? Claramente essas informações não pertencem a uma conta. Esses dados

pertencem ao titular da conta, ou seja, essas informações pertencem ao cliente do banco.

Então devemos armazená-las em uma classe Cliente.

1

2

3

4

5

6

7

class Cliente { public string nome; public string cpf; public string rg; public string endereco; }

Sabemos também que toda conta está associada a um cliente, ou seja, a conta guarda uma referência ao

cliente associado.

1

2

3

4

5

class Conta { // outros atributos da Conta

public Cliente cliente;

Page 16: Bem Vindo Ao Curso C

6

7

8

// comportamentos da conta }

Agora, quando vamos criar uma conta, podemos também colocar um cliente.

1

2

3

4

5

Cliente victor = new Cliente(); victor.nome = "victor";

Conta umaConta = new Conta(); umaConta.cliente = victor;

Vimos também que a variável cliente guarda uma referência(seta) para uma instância de Cliente(objeto na

memória). Logo, a atribuição umaConta.cliente = victor está copiando a referência da variável victor para o atributo cliente.

Podemos modificar os atributos do cliente através da referência guardada no atributo cliente da Conta.

1

2

3

4

5

6

7

8

9

Cliente victor = new Cliente(); victor.nome = "victor"; Conta umaConta = new Conta(); umaConta.cliente = victor;

umaConta.cliente.rg = "12345678-9"; MessageBox.show(umaConta.cliente.nome);

Até o momento, nós temos duas classes que representam o nosso sistema: Conta e Cliente.

1

2

3

4

5

6

class Conta { public int numero; public double saldo; public Cliente cliente; }

1

2

3

4

5

6

7

class Cliente { public string nome; public string cpf; public string rg; public string endereco; }

Com base nessas duas classes, vamos por a mão na massa novamente. Lembre-se de escrever o código mais bonito que conseguir e de testar o seu programa antes de enviar!