Sei sulla pagina 1di 16

Bem vindo ao curso C# e Orientao a Objetos da Caelum.

Nesse curso, aprenderemos como


utilizar conceitos de orientao a objetos junto com uma das linguagens de programao mais
poderosas para desenvolver sistemas complexos e de fcil manuteno.
Antes de comearmos o curso, configuraremos o ambiente de desenvolvimento.
Entre no site http://www.microsoft.com/visualstudio/eng/downloads#d-2010-express, escolha a
opo 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 boto next para comear o processo de instalao.

No prximo passo, o instalador nos informa quais so os componentes do Visual C# que sero
instalados no computador.

Quando clicarmos no boto next, o instalador comear a fazer o download e a instalao do


Visual C#

Agora a instalao est concluda!

O primeiro programa em C#
Agora que j instalamos o Visual C#, vamos criar nossa primeira aplicao.
Abra o Visual C# 2010 e aperte Ctrl+Shift+N.

Na janela de novo projeto, escolha a opo 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 boto no formulrio que, quando clicado, abrir uma caixa de
mensagem do Windows.
Para criar o boto, precisamos apenas usar o atalho Ctrl+W, X e arrastar um button para o
formulrio.

Agora d um clique duplo no boto que acabamos de adicionar para programarmos o que deve
acontecer quando o boto for clicado. O Visual Studio abrir o cdigo do formulrio. No se
preocupe com todo o cdigo 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
using
using
using
using
using
using
using

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

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

15
16
17
18
19
20
21
22
23

private void button1_Click(object sender, EventArgs e)


{
}
}
}

O trecho de cdigo que nos interessa no momento :


1
2
3

private void button1_Click(object sender, EventArgs e)


{
}

Todo cdigo que for colocado dentro das chaves ser executado quando o boto for clicado.
No clique do boto, queremos executar o comando que mostra uma caixa de mensagens para o
usurio.
1

MessageBox.Show(mensagem)

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

MessageBox.Show(mensagem);

Queremos que, ao clicar no boto, a mensagem Hello World seja exibida em uma caixa de
mensagens. Ento, utilizaremos o seguinte cdigo:
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 fora a coloc-la entre aspas
duplas. Portanto, o cdigo do clique do boto ficar assim:
1
2
3
4

private void button1_Click(object sender, EventArgs e)


{
MessageBox.Show("Hello World");
}

O cdigo completo fica da seguinte forma:


1
2
3

using
using
using
using

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

4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

using
using
using
using

System.Drawing;
System.Linq;
System.Text;
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");
}
}
}

No se preocupe com as linhas de cdigo que no foram explicadas. Entenderemos o que elas
fazem durante o curso.
Aperte F5 para executar o cdigo do formulrio. O resultado deve ser algo parecido com a
imagem abaixo:

Na maioria dos programas que escrevemos, no estamos interessados em apenas mostrar uma
caixa de mensagens para o usurio. Queremos tambm armazenar e processar informaes.
Em um sistema bancrio, por exemplo, estaramos interessados em armazenar o saldo de uma
conta e o nome do correntista. Para armazenar esses dados, precisamos pedir para o C#
reservar regies de memria que sero utilizadas para armazenar informaes. Essas regies de
memria so conhecidas como variveis.

As variveis guardam informaes de um tipo especfico. Podemos, por exemplo, guardar um


nmero inteiro representando o nmero da conta, um texto para representar o nome do
correntista ou um nmero real para representar o saldo atual da conta. Para utilizar uma varivel,
devemos primeiramente declar-la no texto do programa.
Na declarao de uma varivel, devemos dizer seu tipo (inteiro, texto ou real, por exemplo) e,
alm disso, qual o nome que usaremos para referenci-la no texto do programa. Para declarar
uma varivel do tipo inteiro que representa o nmero de uma conta, utilizamos o seguinte cdigo:
1

int numeroDaConta;

Repare no ';' no final da linha. Como a declarao de uma varivel um comando da linguagem
C#, precisamos do ';' para termin-lo.
Alm do tipo int (para representar inteiros), temos tambm os tipos double e float (para nmeros
reais), string (para textos), entre outros.
Depois de declarada, uma varivel pode ser utilizada para armazenar valores. Por exemplo, se
estivssemos interessados em guardar o valor 1 na varivel "numeroDaConta" que declaramos
anteriormente, utilizaramos o seguinte cdigo:
1

numeroDaConta = 1;

L-se "numeroDaConta recebe 1". Quando, no momento da declarao da varivel, sabemos


qual ser seu valor, podemos utilizar a seguinte sintaxe para declarar e atribuir o valor para a
varivel.
1

double saldo = 100.0;

Operaes com variveis


Agora que j sabemos como guardar informaes no programa, estamos interessados em
executar operaes nesses valores. Pode ser interessante para um correntista saber qual ser o
saldo de sua conta aps um saque de 10 reais. Para realizar essa operao, 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 varivel:


1
2
3

double saldo = 100.0;


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

Depois de realizar o saque, queremos mostrar para o usurio qual o saldo atual da conta. Para
mostrarmos essa informao, utilizaremos novamente o MessageBox.Show:
MessageBox.Show("O saldo da conta aps o saque : " + valorAposSaque);
1

Tomando decises no cdigo


Voltando para nosso exemplo de aplicao bancria, 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 operao, seno no podemos permitir o saque.
Precisamos fazer execuo condicional de cdigo.
No C#, podemos executar cdigo condicional utilizando a construo if:
1
2
3
4

if (condicao)
{
// Esse cdigo ser ser executado somente se a condio for verdadeira
}

No nosso exemplo, queremos executar a lgica 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)
{
// cdigo do saque.
}

O cdigo do saque deve diminuir o saldo da conta e mostrar uma mensagem para o usurio
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 no tiver saldo suficiente para o saque, o usurio no avisado. Ento
estamos na seguinte situao: "Se a conta tiver saldo suficiente, quero fazer o saque, seno,
quero mostrar a mensagem Saldo Insuficiente para o usurio". Para fazer isso, podemos usar
o else do C#:
1
2
3
4
5
6
7

if (saldo >= valorSaque)


{
// cdigo do saque
}
else
{
MessageBox.Show("Saldo Insuficiente");
}

Mais sobre condies


Repare na expresso que passamos para o if: saldo >= valorSaque. Nele utilizamos o
operador "maior ou igual". Alm dele, h outros operadores de comparao que podemos utilizar:
maior (>), menor (<), menor ou igual (<=), igual (==) e diferente (!=). E ainda existem mais opes
que podemos passar como condio 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 expresso saldo >= valorSaque tambm tem um tipo
associado: o tipo bool, que pode assumir os valorestrue (verdadeiro) ou false (falso).
Podemos inclusive guardar um valor desse tipo numa varivel:
1

bool podeSacar = (saldo >= valorSaque);

Tambm podemos realizar algumas operaes com valores do tipo bool. Podemos, por
exemplo, verificar se duas condies so verdadeiras ao mesmo tempo usando o
operador && (AND):
1

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

Assim, podemos construir condies mais complexas para um if. Por exemplo, podemos usar a
varivelrealmentePodeSacar declarada acima no if que verifica se o cliente pode sacar ou
no:
1
2
3
4
5
6
7
8

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

Repetindo um bloco de cdigo


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 ms. O
investimento paga 1% do valor investido ao ms.
Por exemplo, se o cliente investir R$ 1000,00, ao final de 12 meses, ter por volta de R$ 1126,82:
no primeiro ms, R$ 1000,00 + R$1000,00 * 1% = R$ 1010,00; no segundo ms, 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

um determinado bloco de cdigo at que uma condio seja satisfeita. Essa estrutura recebe o
nome de loop.
Para fazer um loop no c#, utilizaremos, inicialmente, a instruo for. O for uma instruo que
possui trs partes:
- A primeira parte a inicializao, onde podemos declarar e inicializar uma varivel que ser
utilizada no for;
- A segunda parte a condio do loop. Enquanto a condio do loop for verdadeira, o loop
continuar executando;
- A terceira parte a atualizao, onde podemos atualizar as variveis que so utilizadas pelo for
Cada uma das partes do for separada por um ;
1
2
3
4

for (inicializao; condio; atualizao)


{
// Esse cdigo ser executado enquanto a condio for verdadeira
}

Veja o cdigo abaixo, por exemplo, onde usamos um for que repetir o clculo 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 comea inicializando a varivel i com 1 e repete o cdigo 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 iterao desse loop, o valor de i cresce (i += 1). No fim, o
cdigo de dentro do for ser repetido 12 vezes, como precisvamos.
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 bancria
geralmente composta por um nmero, nome do titular e saldo. Podemos guardar essas
informaes em variveis:
1
2
3

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

Para representar outros correntistas, precisamos de novas variveis:


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 variveis.
Ento, por que no 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 variveis automaticamente?
Para fazer isso, criaremos o que conhecido por classe. Uma classe representa uma entidade,
um conceito de domnio da nossa aplicao. Vamos representar uma Conta (em um arquivo
Conta.cs). Ela tem nmero, 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. Tambm 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 tero nmero, titular e saldo. Vamos
experimentar.
Para criar uma nova Conta, basta usarmos a palavra new e guardarmos o resultado em uma
varivel:
1

Conta umaConta = new Conta();

Com essa instncia de Conta em mos (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 prtico! Resumindo, uma classe nos ajuda a centralizar todas as informaes de
nossas entidades, facilitando a reutilizao dela!

Veja como ficou a memria: temos dois objetos (ou instncias) e duas referncias
(umaConta e outraConta) que apontam para esses objetos. Repare que umaConta no um
objeto, mas sim uma referncia (uma seta) para o objeto! O objeto o que est na memria.
Agora vamos analisar um outro exemplo: a transferncia de dinheiro entre duas contas, isto ,
pegar o dinheiro de uma instncia 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 implementao de uma transferncia bem simples! Agora, sempre que precisarmos
transferir dinheiro em nosso sistema, basta colocarmos essas 3 linhas de cdigo. Mas ser que
isso pode virar um problema? Sempre que precisarmos fazer uma transferncia, so apenas 3
linhas de cdigo!
O problema aparece quando precisamos dar manuteno nesse cdigo. Imagine que a regra de
negcio mude e toda transferncia passe a custar R$0,10. Ou seja, em uma transferncia 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 fcil? Um bom design orientado a objetos
aquele que facilita as alteraes, a sua manuteno.
Uma soluo para isso colocar esse comportamento em algum lugar que seja fcil de ser
encontrado e de ser reutilizado. Um bom lugar para ele dentro da prpria classe Conta. Uma
classe pode conter, alm de atributos, mtodos que manipulam esses atributos.
Vamos comear por um comportamento mais simples: um saque. Em uma operao de saque,
devemos receber o valor a ser sacado. Veja o mtodo Saca, dentro da classe Conta. Ele recebe
um parmetro 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 mtodo Saca() deve tirar o valor recebido do saldo da conta:

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 tambm o
uso do public para que possamos chamar esse mtodo em outros trechos de cdigo. 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 instruo mauricio.Saca() invoca o mtodo Saca() para a instncia mauricio, ou seja, o


saque acontecer nessa conta! Podemos sacar de outras contas tambm, de maneira anloga:
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 prximo comportamento: depsito. Anlogo ao mtodo 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 prximo comportamento mais interessante. Vamos modelar uma operao de transferncia.


Para transferir, precisamos ter 2 contas em mos: a conta de origem e a conta de destino.
Uma primeira alternativa seria criar um mtodo ento que recebe 3 parmetros: 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 mtodo, faramos algo como:


1
2
3
4

Conta mauricio = new Conta();


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

Veja que repetimos a varivel "mauricio" duas vezes. Como nossos mtodos so sempre
disparados a partir de instncias de objetos (mauricio.Transfere(..), por exemplo), no
precisamos da origem: a origem o prprio objeto!

1
2
3
4

public void Transfere(double valor, Conta destino) {


this.saldo -= valor;
destino.saldo += valor;
}

Veja o cdigo 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 cdigo. Veja que acabamos de escrever um trecho de cdigo
repetido, pois a linhathis.saldo -= valor; exatamente o mtodo Saca(). Vamos
reutilizar esses mtodos:
1
2
3
4

public void Transfere(double valor, Conta destino) {


this.Saca(valor);
destino.Deposita(valor);
}

Veja que agora estamos produzindo cdigo orientado a objetos. Dados e comportamentos devem
viver perto. Se um dia a regra de negcio de transferncia mudar, mudaremos apenas dentro do
mtodo Transfere(), e essa mudana ser automaticamente propagada para todas as
transferncias.
Quando abrimos uma conta no banco, temos que fornecer uma srie de informaes: nome, cpf, rg e
endereo.
Vimos que quando queremos armazenar informaes em uma classe, devemos criar atributos. Mas em qual
classe colocar esses novos atributos? Claramente essas informaes no pertencem a uma conta. Esses dados
pertencem ao titular da conta, ou seja, essas informaes pertencem ao cliente do banco.
Ento devemos armazen-las em uma classe Cliente.
1
class Cliente
2
{
3
public string nome;
public string cpf;
4
public string rg;
5
public string endereco;
6
}
7
Sabemos tambm que toda conta est associada a um cliente, ou seja, a conta guarda uma referncia ao
cliente associado.
class Conta
1
{
2
// outros atributos da Conta
3
4
public Cliente cliente;
5

6
7
8

// comportamentos da conta
}

Agora, quando vamos criar uma conta, podemos tambm colocar um cliente.
1
2
3
4
5

Cliente victor = new Cliente();


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

Vimos tambm que a varivel cliente guarda uma referncia(seta) para uma instncia de Cliente(objeto na
memria). Logo, a atribuio umaConta.cliente = victor est copiando a referncia da varivel victor
para o atributo cliente.
Podemos modificar os atributos do cliente atravs da referncia 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, ns 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
public string
public string
public string
}

nome;
cpf;
rg;
endereco;

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

Potrebbero piacerti anche