Você está na página 1de 37

Sumrio

.NET 06 Fundamentos bsicos de orientao a objetos com C#


[ Ricardo Coelho ]

17 - Descobrindo o Windows 8
.Net

Boa Ideia
[ Titao Yamamoto ]

Ol, eu sou o DevMan! Desta p-


gina em diante, eu estarei lhe aju-

.Net 27 Namespace System.IO Parte 2 dando a compreender com ainda


[ Fbio Rosa ] mais facilidade o contedo desta
edio. Ser um prazer contar com
sua companhia! Confira abaixo o
que teremos nesta revista:
Expediente Editorial

EDITORIAL

H
oje em dia o paradigma da orientao a objetos est cada vez mais forte
no mercado e na comunidade, por outro lado, existe um gap enorme para
quem est comeando a entrar no mundo O.O e por este motivo eu escrevi
sobre alguns fundamentos bsicos de orientao a objetos, passando pelo conceito
de value types e reference types, aproveitando para citar alguns padres de projeto
e recursos do C# que vo de encontro com os conceitos abordados.
Ano 3 - 26 Edio 2012 - ISSN 2179624-6
Alm disso, temos tambm a segunda e ltima parte do artigo sobre o namespace
System.IO, onde o Fbio Rosa nos apresenta as classes para manipulao de streams
e nos traz informaes valiosas para usarmos em nosso dia-a-dia.
Para finalizar, Titao Yamamoto nos apresenta as novidades do Windows 8, desven-
Corpo Editorial dando os novos conceitos, algumas preocupaes que devemos ter e nos apresen-
tando novas oportunidades com a windows store.

Um grande abrao e uma excelente leitura!


Editor Geral
Ricardo Coelho (rcoelhorj@gmail.com)

Jornalista Responsvel
Kaline Dolabella - JP24185

Ricardo Coelho
Na Web
www.devmedia.com.br/revista-easy-dotnet-magazine Ricardo Coelho rcoelhorj@gmail.com
Editor Chefe da .net Magazine e Easy .net Magazine

Atendimento ao Leitor
A DevMedia conta com um departamento exclusivo para o atendimento ao leitor. Se voc tiver algum
problema no recebimento do seu exemplar ou precisar de algum esclarecimento sobre assinaturas,
exemplares anteriores, endereo de bancas de jornal, entre outros, entre em contato com:

www.devmedia.com.br/central
(21) 3382-5038
Fale com o Editor!
muito importante para a equipe saber o que voc est achando da revista: que tipo de artigo voc
Publicidade gostaria de ler, que artigo voc mais gostou e qual artigo voc menos gostou. Fique a vontade para
entrar em contato com os editores e dar a sua sugesto!
Para informaes sobre veiculao de anncio na revista ou no site e para fechar parcerias ou aes
especficas de marketing com a DevMedia, entre em contato com: Se voc estiver interessado em publicar um artigo na revista ou no site .NET Magazine, entre em
contato com os editores, informando o ttulo e mini-resumo do tema que voc gostaria de publicar:
Cristiany Queiroz
publicidade@devmedia.com.br Ricardo Coelho Editor da revista
rcoelhorj@gmail.com

Assine agora e tenha acesso a


todo o contedo da DevMedia:
www.devmedia.com.br/mvp
Seo .Net Nesta seo voc encontra artigos bsicos sobre as tecnologias .net

Fundamentos bsicos de
Orientao a Objetos
Uma introduo orientao a objetos em C#

A Resumo DevMan
tualmente existem dois paradigmas principais
de desenvolvimento de software na mente dos
desenvolvedores e no mercado. Temos o para- De que se trata o artigo:
digma estruturado, que antes dominava o mercado, e o Este artigo trata sobre os principais fundamentos da orientao a obje-
paradigma da orientao a objetos (O.O), que cada vez tos em C# explicando os conceitos de abstrao, herana e polimorfismo,
mais vai ganhando seu espao. alm de falar sobre a implementao de alguns destes fundamentos
O fato que a orientao a objetos vem tendo sua em C#, assim como palavras reservadas do mesmo que incidem sobre
adoo numa crescente no mercado, mas por outro lado estes conceitos.
na maioria das vezes ela subutilizada. muito comum
vermos equipes de desenvolvimento que desconhecem Em que situao o tema til:
alguns fundamentos bsicos da orientao a objetos, que Os tpicos abordados neste artigo podero ser teis no dia a dia de todo
so os pilares da mesma, como por exemplo a diferena desenvolvedor, pois trataremos de conceitos bsicos e fundamentais da
entre uma classe e um objeto, os conceitos de value types orientao a objetos (O.O) possibilitando que o leitor no apenas entre
e reference types, o conceito de abstrao com heranas nesse mundo como tambm compreenda melhor a arquitetura e alguns
e interfaces, dentre outros. dos recursos que vier a utilizar no .NET framework.
A ideia deste artigo apresentar alguns dos conceitos
mais bsicos e fundamentais da orientao a objetos com Fundamentos bsicos de Orientao a Objetos:
exemplos pontuais e aplicados ao C#. Vamos aproveitar Neste artigo veremos os principais conceitos e fundamentos da orien-
tambm para falar sobre algumas palavras reservadas tao a objetos aplicados no C#. Alm disso, veremos o uso das palavras
do C# que esto relacionadas aos conceitos que vamos chaves virtual, override, abstract, sealed, partial e dos modificadores de
apresentar. acesso public, protected, internal, protected internal e private.

Programao estruturada VS Programao Orientada


a Objetos A orientao a objetos surgiu com o objetivo de tornar o desen-
ntigamente, h algumas dcadas atrs, o paradigma
A volvimento de software menos complexo e mais produtivo. A ideia
que predominava no desenvolvimento de software era o termos estruturas de dados que possuem estado e comportamen-
da programao estruturada. Basicamente os softwares to e que colaboram entre si. Dessa forma deixaramos de ter todas
eram compostos por rotinas e sub-rotinas que chamavam as rotinas e sub-rotinas espalhadas pelo sistema e passaramos
umas s outras, alm de variveis que tinham escopo a aloc-las nestas estruturas de dados, de forma coesa, cada qual
local (dentro de rotinas / sub-rotinas) ou global. Assim com sua responsabilidade. Alm disso, encapsularamos as vari-
como todo paradigma, o paradigma estruturado tinha veis nestas mesmas estruturas, controlando o acesso s mesmas
seus prs e contras e foi bastante eficiente no que se e tornando pblico apenas aquilo que for pertinente.
props durante seus anos de domnio no mercado, alm O paradigma da orientao a objetos possui trs conceitos
de ter sido bastante importante para a evoluo da enge- fundamentais:
nharia de desenvolvimento de software. Encapsulamento Prev o isolamento a determinados elementos
Com o passar dos anos surgiu o paradigma da do objeto (mtodos /atributos) de acordo com a necessidade de
orientao a objetos, que tambm no to novo como acesso a eles. Este conceito parte da premissa de que nem todo m-
muitos pensam, mas que veio a ganhar mais fora na todo e atributo precisam estar visveis e acessveis publicamente.
ltima dcada. Existem elementos que so pertinentes apenas ao prprio objeto,

6 Easy .Net Magazine Edio 26


outros pertinentes aos objetos filhos e outros que so pertinentes A diferena chave entre os dois tipos na passagem de valores
a todos os objetos associados. O encapsulamento se d atravs dos dos mesmos. No caso dos reference types, os valores dos objetos
modificadores de acesso, que veremos mais a frente. no so copiados, mas apenas sua referncia, enquanto que nos
Abstrao a capacidade de focar nos pontos mais importantes value types os valores so copiados de um objeto para o outro.
do domnio de aplicao do sistema e abstrair os detalhes menos Todos os objetos que so do tipo de uma classe ou interface so
relevantes. Na modelagem de um sistema orientado a objetos, reference types. Tipos enumerados e tipos primitivos so value
uma classe tende a ser a abstrao de entidades existentes no types. Ao atribuirmos uma referncia de value type a outra,
mundo real (domnio da aplicao). Ex.: Cliente, Funcionrio, estamos literalmente copiando o seu valor, replicando o mesmo
Conta Bancria. para o novo elemento. Ao atribuirmos uma referncia de um
Polimorfismo a capacidade de um elemento assumir diferen- reference type para outro, no h cpia de valores, mas apenas
tes formas. Na orientao a objetos, chamamos de polimorfismo de suas referncias.
a possibilidade que temos de mudar o comportamento de um Observe no exemplo da Listagem 1 onde declaramos duas va-
mesmo mtodo de um objeto dentro da sua hierarquia. riveis valorA e valor B, nas linhas 15 e 16 respectivamente. Com
esta declarao imagine que temos dois espaos em memria,
Alm disso, podemos citar os seguintes elementos com sendo um para a varivel valorA com o valor 10 e outro para a varivel
os alguns dos principais da orientao a objetos: valorB com o valor 20. Na linha 20 atribumos valorB ao valorA.
Classe Uma classe um tipo de dado que representa tudo Neste momento, o sistema copiou o valor de B para A, ento agora
aquilo que um objeto deste tipo poder ter/fazer. Na classe temos ainda dois espaos em memria, um com o valorA de 10
determinamos o que ser armazenado em seu estado e quais e outro com o valorB tambm com 10. Na linha 24 alteramos o
comportamentos ele ter. Ela funciona como uma estrutura de valorA mesmo para 50, passando a ter no primeiro espao em
referncia para a criao de objetos. memria o valor de 50 e no segundo o valor de 20. Observe que
Objeto Um objeto uma instncia de uma classe. a estrutura ao atribuirmos o valorB ao valorA na linha 20, ns copiamos todo
completa, criada em memria, que ir representar a classe com o contedo de uma posio de memria para outra. Na Figura 2
tudo o que foi definido nela, inclusive com os valores armazenados temos uma ilustrao do que ocorre aps a atribuio.
nos seus respectivos atributos.
Atributos Os atributos representam o estado e as caracters- Listagem 1. Exemplo de Value Types
ticas de um objeto. neles que armazenaremos as informaes
01 using System;
de nossos objetos. Ex.: Nome, Idade, Endereo etc.
02 using System.Collections.Generic;
M todos Representam os comportamentos de nossos objetos ou 03 using System.Linq;
operaes que os mesmos podem executar. Traando um paralelo 04 using System.Text;
ao mundo real, seriam todas as aes que o objeto pode executar. 05 using ExemplosFundamentos.Modificadores;
Ex.: ValidarCPF, AprovarCredito, LiberarPagamento etc... 06 using ExemplosFundamentos.AbstractExemplo;
07 using ExemplosFundamentos.PartialClass;
08
Na Figura 1 podemos ver que uma classe pode ser instanciada 09 namespace ExemplosFundamentos
diversas vezes, dando origem a diversos objetos diferentes. 10 {
11 class Program
12 {
13 static void Main(string[] args)
14 {
15 double valorA = 10;
16 double valorB = 20;
17 Console.WriteLine(valorA : + valorA);
18 Console.WriteLine(valorB : + valorB);
19 Console.WriteLine(Copiando valor de A para B...);
20 valorB = valorA;
21 Console.WriteLine(valorA : + valorA);
22 Console.WriteLine(valorB : + valorB);
23 Console.WriteLine(Alterando valor de A para 50...);
24 valorA = 50;
25 Console.WriteLine(valorA : + valorA);
26 Console.WriteLine(valorB : + valorB);
Figura 1. Representao Grfica de classe com muitos objetos 27 Console.ReadLine();
28 }

Tipos de Referncia x Tipos de Valor 29


30 }
}

Em C# ns temos duas classificaes de tipos de dados: os tipos


de referncia (References Types) e os tipos de valor (Value Types).

Edio 26 Easy .Net Magazine 7


Fundamentos bsicos de Orientao a Objetos

Observando a Figura 3 podemos ver o resultado da execuo Na listagem 2 temos um exemplo semelhante, porm, ao invs
do nosso cdigo. Observe que os valores de A e B se mantiveram de usar variveis do tipo Double, estamos usando objetos do tipo
independentes, mesmo aps atribuio de um ao outro, pois o Produto. Nas linhas 16 e 18 ns criamos dois objetos do tipo Produto.
valor foi simplesmente copiado de uma posio de memria para Neste momento temos duas variveis de referncia apontando
a outra. para dois espaos de memria diferentes.
No caso dos reference types, ocorre algo diferente. Vejamos a Na linha 24 atribumos produtoB ao produtoA. neste ponto
Listagem 2. que entra a principal diferena entre value types e reference
types. No caso de value types ns vimos que o valor foi copiado
de uma varivel para outra. Neste caso apenas a referncia de
produtoB copiada para produtoA. Com isso, passamos a ter
duas variveis, produtoA e produtoB, apontando para o mesmo
espao em memria. Isso significa que a partir deste momento
qualquer alterao que fizermos tanto em produtoA quanto em
produtoB estaro refletindo no mesmo espao em memria e
isso pode ser melhor observado na ilustrao da Figura 4.
Observando a Figura 5, podemos observar que a partir do
momento que atribumos produtoB ao produtoA, ambos pas-
sam a apontar para o mesmo espao em memria. Observe que
ao alterarmos a descrio do produtoA para Scanner, o valor
de produtoB tambm parece ter mudado. Na verdade, o que
acontece que produtoB est apontando para o mesmo lugar
de produtoA em memria.
Mas e o que aconteceu com a instncia criada na linha 16? Ela
se perdeu e no conseguimos mais acessar a mesma, ficando
Figura 2. Ilustrao - Atribuio de Value Types a cargo do Garbage Collector (Nota do DevMan 1) a liberao
dela da memria.

Class x Struct
Q uando declaramos uma classe, estamos criando um mode-
lo de objetos. Estamos dizendo que todos os objetos daquele
tipo tero determinados mtodos e atributos. Ao criarmos um
novo objeto (com o operador new), estamos criando uma nova
instncia desta classe e retornando a referncia para a esta
instncia.
Figura 3. Resultado da Listagem 1

Listagem 2. Exemplo de Reference Types

01 using System; 19 produtoB.Descricao = Notebook;


01 using System.Collections.Generic; 20 Console.WriteLine(Produto A: + produtoA.Descricao);
03 using System.Linq; 21 Console.WriteLine(Produto B: + produtoB.Descricao);
04 using System.Text; 22 Console.WriteLine(......);
05 using ExemplosFundamentos.Modificadores; 23 Console.WriteLine(Atribuindo produtoB ao produtoA);
06 using ExemplosFundamentos.AbstractExemplo; 24 produtoA = produtoB;
07 using ExemplosFundamentos.PartialClass; 25 Console.WriteLine(Produto A: + produtoA.Descricao);
08 using ExemplosFundamentos.SealedClass; 26 Console.WriteLine(Produto B: + produtoB.Descricao);
09 27 Console.WriteLine(......);
10 namespace ExemplosFundamentos 28 Console.WriteLine(Alterando a descrio de produtoA para Scanner);
11 { 29 produtoA.Descricao = Scanner de Mesa;
12 class Program 30 Console.WriteLine(Produto A: + produtoA.Descricao);
13 { 31 Console.WriteLine(Produto B: + produtoB.Descricao);
14 static void Main(string[] args) 32 Console.ReadLine();
15 { 33 }
16 Produto produtoA = new Produto(); 34 }
17 produtoA.Descricao = Computador Desktop; 35 }
18 Produto produtoB = new Produto();

8 Easy .Net Magazine Edio 26


Na Listagem 3 temos um exemplo de classe com os atributos Apesar de um Struct ter a sintaxe parecida com de uma classe,
referentes cliente, enquanto que na Listagem 4 temos a criao ele um value type. Essa a diferena fundamental entre os
de um objeto deste tipo (classe cliente). Vale ressaltar que em .NET mesmos. Um struct tambm suporta construtores parametrizados
toda classe um reference type. (Nota do DevMan 2), mtodos e properties, mas preciso tomar
Outro conceito que temos o de struct que, em .NET, uma cuidado, pois a ideia do struct armazenar estruturas de dados
estrutura de dados usada para agrupar dados que possuem algum pequenas. Ou seja, se voc tem uma estrutura grande, ou com
tipo de relao. muitos mtodos e regras, melhor avaliar o uso de uma classe.
Nas Listagens 5 e 6 temos um exemplo de declarao e uso de
um struct.

Herana
Em orientao a objetos, herana quando uma classe (filha)
herda todas as caractersticas (atributos e mtodos) de outra
classe (pai). A herana est diretamente relacionada ao polimor-
fismo, pois atravs da herana podemos sobrescrever e estender
funcionalidades do sistema. A classe pai considerada a classe

Nota do DevMan 1
Garbage Collector (GC) o gerenciador de objetos em memria do .NET, responsvel por liberar
da memria as instncias no utilizadas pela aplicao. Quando o GC identifica um objeto de sua
aplicao que no possui nenhuma referncia, ele destri o mesmo e libera espao em memria.

Nota do DevMan 2
Um construtor um mtodo que possui o mesmo nome da classe e acionado toda vez que a
classe / struct criada (atravs operador new). Por default toda classe/struct possui um construtor
default sem parmetros, porm, podemos implementar quantos construtores parametrizados forem
necessrios. Normalmente o construtor utilizado para passagem de objetos que sua classe dependa
e para inicializao de atributos da classe.

Listagem 3. Exemplo de classe em C#

01 using System;
02 using System.Collections.Generic;
03 using System.Linq;
04 using System.Text;

05 namespace DevMedia.EasyNet
06 {
07 public class Cliente
08 {
09 public string Nome { get; set; }
10
11 public int Idade { get; set; }
Figura 4. Atribuio de Reference Types 12
13 public DateTime DataCadastro { get; set; }
14 }
15 }

Listagem 4. Exemplo de criao de um objeto em C#

Cliente cliente = new Cliente();


cliente.Nome = Ricardo Coelho;
cliente.Idade = 25;
cliente.DataCadastro = DateTime.Parse(09/02/2005);
Figura 5. Resultado da Listagem 2

Edio 26 Easy .Net Magazine 9


Fundamentos bsicos de Orientao a Objetos

genrica enquanto que suas classes filhas so consideras as classes butos referentes documentao de cada uma delas. Observe
especializadas. que declaramos apenas aquilo que exclusivo e pertinente a
A herana uma faca de dois gumes, pois ao mesmo tempo em cada uma, porm ambas possuem Nome, Endereco e Pais, pois
que pode ajudar, trazendo mais reuso de cdigo, pode tambm herdam de Pessoa.
atrapalhar, gerando muito acoplamento entre seus objetos, visto
que qualquer alterao na classe genrica ser refletida direta-
mente em todas as classes especializadas. Listagem 7. Classe Pessoa Classe Pai

01 using System;
Listagem 5. Exemplo de declarao de um struct 02 using System.Collections.Generic;
03 using System.Linq;
01 using System; 04 using System.Text;
02 using System.Collections.Generic; 05
03 using System.Linq; 06 namespace ExemplosFundamentos.Heranca
04 using System.Text; 07 {
05 08 public class Pessoa
06 namespace ExemplosFundamentos.StructExample 09 {
07 { 10 public string Nome { get; set; }
08 public struct PontoGeometrico 11
09 { 12 public String Endereco { get; set; }
10 public string Latitude { get; set; } 13
11 14 public String Pais { get; set; }
12 public string Longitude { get; set; } 15 }
13 } 16 }
14 }
Listagem 8. Classe PessoaFisica
Listagem 6. Exemplo de uso de um struct
01 using System;
using System; 02 using System.Collections.Generic;
using System.Collections.Generic; 03 using System.Linq;
using System.Linq; 04 using System.Text;
using System.Text; 05
using ExemplosFundamentos.StructExample; 06 namespace ExemplosFundamentos.Heranca
07 {
namespace ExemplosFundamentos 08 public class PessoaFisica:Pessoa
{ 09 {
class Program 10 public string CPF { get; set;}
{ 11
static void Main(string[] args) 12 public string RG { get; set;}
{ 13 }
PontoGeometrico ponto = new PontoGeometrico(); 14 }
ponto.Latitude = -40.0.0;
ponto.Longitude = -20.0.0; Listagem 9. Classe PessoaJuridica
Console.WriteLine(Latitude: + ponto.Latitude);
Console.WriteLine(Longitude: + ponto.Longitude); 01 using System;
Console.ReadLine(); 02 using System.Collections.Generic;
} 03 using System.Linq;
} 04 using System.Text;
} 05
06 namespace ExemplosFundamentos.Heranca
07 {
08 public class PessoaJuridica:Pessoa
09 {
ma classe pai pode ser herdada por diversas classes filhas, no
U
10 public string CNPJ { get; set; }
existindo limite para este caso. Por outro lado uma classe filha 11
s pode ter uma classe pai, ou seja, o .NET no suporte herana 12 public string InscricaoEstadual { get; set; }
13 }
mltipla de classes. 14 }
Na Listagem 7 definimos nossa classe pai Pessoa que servir
de base para as outras. Observe que definimos apenas os itens
que so comuns a todas as pessoas de nosso sistema, sendo os Nos exemplos acima colocamos apenas um nvel de hierarquia,
atributos Nome, Endereco e Pais. Sempre que criarmos uma porm, no h limites impostos pelo framework para isso. Pode-
hierarquia de classes em nossos sistemas temos que tomar cui- ramos, por exemplo, criar outras classes como FornecedorNacio-
dado em colocar na classe pai apenas aquilo que realmente for nal e FornecedorInternacional herdando de PessoaJuridica. Vale
comum a todos os filhos. ressaltar o bom senso e a anlise de cada caso para que se evite a
Nas Listagens 8 e 9 temos nossas classes filhas (especialistas) criao de estruturas desnecessariamente complexas e acopladas
PessoaFisica e PessoaJuridica, onde temos a definio dos atri- em nossos sistemas.

10 Easy .Net Magazine Edio 26


O utro ponto interessante para citar a respeito de herana Virtual x Override
sobre as regras de type casting da mesma. Utilizando herana Como vimos anteriormente, podemos criar estruturas hierr-
possvel atribuirmos uma instncia de um objeto filho uma quicas de classes reaproveitando comportamento e estado das
varivel declarada do tipo de um objeto pai, como podemos ver classes superiores, porm, algumas vezes preciso sobrescrever
na Listagem 10. determinados comportamentos da classe pai nas classes filhas,
aplicando assim o conceito de polimorfismo.
Listagem 10. Cast mplicito - Herana Em orientao a objetos, dizemos que um mtodo sobrescrito
quando a implementao dele prevalece com relao implemen-
01 using System;
02 using System.Collections.Generic; tao de uma classe pai.
03 using System.Linq; As palavras reservadas virtual e override se aplicam exatamente
04 using System.Text; a isso. Devemos usar a palavra reservada virtual para indicar que
05 using ExemplosFundamentos.Heranca;
06 um mtodo pode ser sobrescrito por uma classe filha, e a palavra
07 namespace ExemplosFundamentos reservada override para indicar que o mtodo est sobrescrevendo
08 {
o mtodo da classe pai.
09 class Program
10 { Vamos imaginar o seguinte cenrio para nosso exemplo:
11 static void Main(string[] args) temos uma classe conta bancria, que possui os atributos de
12 {
uma conta normal- agencia, numero da conta e dgito. A ideia
13 Pessoa pessoa = new Pessoa();
14 Pessoa pessoaA = new PessoaFisica(); que esta classe represente uma conta comum. Alm disso,
15 Pessoa pessoaB = new PessoaJuridica(); esta classe tem um mtodo GetTarifaManutencao que nos dir
16 (pessoaA as PessoaFisica).CPF = 9999999;
17 Console.WriteLine((pessoaA as PessoaFisica).CPF);
qual o valor da tarifa mensal desta conta, conforme podemos
18 Console.ReadLine(); ver na Listagem 11.
19 }
20 }
21 }
Listagem 11. Classe ContaBancaria

01 using System;
bserve na Listagem 10, nas linhas 13, a 15, que temos trs va-
O 02 using System.Collections.Generic;
riveis declaradas e cada uma recebe uma instncia de um tipo 03 using System.Linq;
04 using System.Text;
diferente. Isso possvel, pois todas as instncias usadas so da 05
hierarquia de Pessoa (usada na declarao da varivel). Por outro 06 namespace ExemplosFundamentos.VirtualOverride
07 {
lado, no caso de pessoaA, por exemplo, no conseguiremos acessar
08 public class ContaBancaria
as propriedades especficas de PessoaFsica, pois a varivel do 09 {
tipo Pessoa. 10 public int Agencia { get; set; }
11
Para acessarmos as caractersticas de PessoaFisica na varivel
12 public int Conta { get; set; }
pessoaA teramos que fazer um type casting (Nota do DevMan 3) 13
explcito com o operador as, como mostrado nas linhas 16 e 17. 14 public int Digito { get; set; }
15
16 public double GetTarifaManutencao() {
17 return 30;
Nota do DevMan 3 18
19 }
}

20 }
Type casting como chamamos a converso de um determinado tipo para outro.
Existem dois tipos de type casting:
Alm da ContaBancaria teremos outras duas classes: Con-
- mplicito O type casting implcito aquele que no pode resultar em perda de dados, o que faz
com que o compilador possa realizar a converso de forma automtica. taEspecial e ContaUniversitaria. A ideia que estas tenham
tarifas de manuteno diferenciadas da conta comum. Estas
- Ex.: Atribuio de uma varivel int em uma varivel long. A varivel long que recebe o dado no
perder informao pois o intervalo possvel de informao de int menor que o de long. classes iro herdar de ContaBancaria e tambm tero o mto-
- Explcito O type casting explcito aquele cuja converso pode resultar em perda de dados , o que do GetTarifaManutencao(), porm, por enquanto no vamos
faz com que o compilador possa realizar a converso de forma automtica. definir os mesmos como virtual/override, como podemos ver
- Ex.: Atribuio de uma varivel long em uma varivel int. A varivel int que recebe o dado poder nas Listagens 12 e 13. Nela temos as classes mais especializadas
perder informao pois o intervalo possvel de informao de int menor que o de long. com as tarifas especficas de manuteno. Observe que no sobres-
No caso de converso de objetos, s possvel realizar o type casting para elementos compatveis com crevemos os mtodos, apenas declaramos com o mesmo nome da
o tipo da declarao. Neste caso podemos usar o operador as para realizar a converso. O operador classe pai. Vamos agora consumir estes objetos para ver o com-
as tenta realizar a converso e caso no seja possvel (tipos incompatveis) retorna null ao invs de portamento deles. Na Listagem 14 observe que declaramos trs
disparar uma exceo.
objetos ContaBancaria, sendo contaBancariaA, contaBancariaB e

Edio 26 Easy .Net Magazine 11


Fundamentos bsicos de Orientao a Objetos

contaBancariaC. Porm, temos uma instncia de ContaBancaria


(linha 13), uma instncia de ContaUniversitaria (linha 16) e uma
instncia de ContaEspecial (linha 19).

Listagem 12. Classe ContaEspecial

01 using System;
02 using System.Collections.Generic;
03 using System.Linq;
04 using System.Text;
05 namespace ExemplosFundamentos.VirtualOverride Figura 6. Resultado da execuo da Listagem 11 sem Virtual-Override
06 {
07 public class ContaEspecial:ContaBancaria
08 { Observando a Figura 6 podemos ver que, apesar de termos
09 public double GetTarifaManutencao()
criado os objetos de ContaUniversitaria e ContaEspecial, nos trs
10 {
11 return 20; casos o mtodo que foi executado foi o da ContaBancaria. Isso
12 } ocorreu porque ns no criamos uma cadeia polimrfica para este
13 }
mtodo na nossa hierarquia de objetos ContaBancaria. Para criar
14 }
esta cadeia precisamos declarar o mtodo GetTarifaManutencao
Listagem 13. Classe ContaUniversitaria como virtual na classe ContaBancaria e declarar o mesmo como
01 using System; override nas classes filhas. Realizando estas alteraes, o cdigo
02 using System.Collections.Generic; ficaria assim:
03 using System.Linq;
04 using System.Text; ContaBancaria
05 public virtual double GetTarifaManutencao() {
06 namespace ExemplosFundamentos.VirtualOverride return 30;
07 { }
08 public class ContaUniversitaria:ContaBancaria
09 { ContaUniversitaria
10 public double GetTarifaManutencao() public override double GetTarifaManutencao(){
11 { return 10;
12 return 10; }
13 }
14 } ContaEspecial
15 } public override double GetTarifaManutencao()
{
Listagem 14. Classe ContaUniversitaria
return 20;
}
01 using System;
02 using System.Collections.Generic;
03 using System.Linq; Com estas definies, ns criamos nossa cadeia polimrfica.
04 using System.Text; Agora se executarmos novamente o cdigo da Listagem 14 tere-
05 using ExemplosFundamentos.VirtualOverride;
06 mos o resultado mostrado na Figura 7.
07 namespace ExemplosFundamentos
08 {
09 class Program
10 {
11 static void Main(string[] args)
12 {
13 ContaBancaria contaBancariaA = new ContaBancaria();
14 Console.WriteLine(contaBancariaA: + contaBancariaA.GetTarifa
Manutencao());
15 Console.WriteLine(...............);
16 ContaBancaria contaBancariaB = new ContaUniversitaria();
17 Console.WriteLine(contaBancariaB: + contaBancariaB.GetTarifa
Manutencao()); Figura 7. Resultado da execuo da Listagem 14 com Virtual-Override
18 Console.WriteLine(...............);
19 ContaBancaria contaBancariaC = new ContaEspecial();
20 Console.WriteLine(contaBancariaC: + contaBancariaC.GetTarifa Observando a Figura 7 percebemos que agora foi executada a
Manutencao()); implementao de cada classe filha devido ao override. Com este
21 Console.WriteLine(...............);
22 Console.ReadLine(); exemplo fica mais fcil de compreender que, caso o mtodo seja
23 } sobrescrito em uma classe filha (assinado com a palavra reservada
24 } override), ele sempre prevalecer com relao ao mtodo de sua
25 }
classe pai.

12 Easy .Net Magazine Edio 26


Modificadores de Acesso Listagem 15. Exemplo de Modificadores de acesso em C#
s modificadores de acesso (Access modifiers) so palavras
O
01 using System;
reservadas do C# para determinar o nvel de acesso que um de-
02 using System.Collections.Generic;
terminado membro que um tipo ter. Os modificadores de acesso 03 using System.Linq;
so fundamentais para garantir o encapsulamento da orientao a 04 using System.Text;
objetos. Os modificadores de acesso so aplicados aos elementos 05
das classes e structs, em seus respectivos mtodos e atributos. 06 namespace ExemplosFundamentos.Modificadores
07 {
O C# possui os seguintes modificadores de acesso:
08 public class Pessoa
Public Este o nvel mais baixo de restrio. Ele indica que o 09 {
elemento no ter restrio de acessos, ou seja, qualquer classe/ 10 public string Nome { get; set; }
struct que conhea o mesmo poder acess-lo. 11
12 protected int Idade { get; set; }
Protected Este nvel indica que o elemento s poder ser aces-
13
sado de dentro da prpria classe/struct ou a partir de uma classe 14 private double Rendimento { get; set; }
descendente. 15
I nternal - Este nvel de acesso indica que o elemento s poder 16 protected internal string Endereco { get; set; }
ser acessado de dentro do assembly em que foi declarado. 17
18 internal string Estado { get; set; }
P rotected Internal Este nvel indica que o elemento s poder
19 }
ser acessado por classes do mesmo assembly e s poder ser 20 }
acessado por classes de assemblies diferentes quando estas forem
Listagem 16. Classe sendo consumida no prprio assembly
descendentes da classe onde fora declarado o elemento.
Private Indica que o elemento s poder ser acessado de dentro 01 using System;
da prpria class/struct em que for declarado. 02 using System.Collections.Generic;
03 using System.Linq;
Na Listagem 15 ns temos todos os modificadores aplicados 04 using System.Text;
05 using ExemplosFundamentos.Modificadores;
classe Pessoa. Nas Listagens 16 e 17 temos dois cenrios simu- 06
lando o uso desta classe. 07 namespace ExemplosFundamentos
Na Listagem 16 temos a nossa primeira simulao de uso do 08 {
nosso objeto pessoa. Imaginemos uma classe consumidora (no 09 class Program
10 {
mesmo assembly de Pessoa) criando um objeto do tipo pessoa.
11 static void Main(string[] args)
Neste caso, s conseguimos acessar os atributos Nome, Estado e 12 {
Endereco, pois os mesmos so Public e Internal. 13 Pessoa pessoa = new Pessoa();
Ao tentarmos criar um objeto Pessoa (linha 13 a 16) e popular 14 pessoa.Nome = Ricardo;
o mesmo em outro assembly, obteremos um erro de compilao 15 pessoa.Estado = RJ;
16 pessoa.Endereco = Rua XPTO;
indicando que no podemos acessar as propriedades Estado e En-
17 }
dereco, devido ao fato das mesmas ter o modificador Internal. 18 }
Por outro lado, na Listagem 17 temos a declarao de uma classe 19 }
PessoaFisica, que herda de pessoa. Vamos imaginar que esta classe
Listagem 17. Classe PessoaFisica herdando de Pessoa, em outro assembly
esteja em um assembly diferente do de Pessoa.
No caso da Listagem 17 ns conseguiremos acessar Endereco, 01 using System;
pois o mesmo Internal Protected, o que significa que este po- 02 using System.Collections.Generic;
03 using System.Linq;
der ser acessado em outros assemblies quando estiver classes
04 using System.Text;
descendentes. 05 using ExemplosFundamentos.Modificadores;
Assim como no caso das properties que exemplificamos acima, 06
os modificadores de acesso tambm podem ser aplicados a m- 07 namespace ExemplosFundamentos.V2
08 {
todos da classe/struct, seguindo as mesmas regras das listagens 09 public class PessoaFisica:Pessoa
acima. Inclusive eles podem ser aplicados a mtodos construtores. 09 {
H casos em que queremos obrigar a classe consumidora, ao 10 public PessoaFisica(){
instanciar um novo objeto, que passe determinados parmetros, 11 base.Nome = Ricardo;
12 base.Idade = 25;
ento colocamos o construtor default como private para que o 13 base.Endereco = Rua XPTO;
mesmo no possa ser acessado, como mostrado na Listagem 18. 14 base.Estado = RJ;
Na Listagem 18 podemos ver que estamos obrigando o objeto 15 }
PessoaFisica a ser criado passando-se o nome, idade, endereo e 16 }
17 }
estado como parmetros.

Edio 26 Easy .Net Magazine 13


Fundamentos bsicos de Orientao a Objetos

Listagem 18. Construtor padro privado

01 using System;
Nota do DevMan 4
02 using System.Collections.Generic;
03 using System.Linq; Singleton um design pattern que prev a criao de apenas uma instncia de um determinado
04 using System.Text; objeto em toda a aplicao. Para isso, os construtores so definidos como private e criado um atributo
05 using ExemplosFundamentos.Modificadores; esttico de referncia da prpria classe, alm de um mtodo, normalmente chamado GetInstance. Na
06 implementao do GetInstance, verificado se o objeto da varivel esttica existe ou no, caso no
07 namespace ExemplosFundamentos.V2 exista ele instanciado, caso exista ele simplesmente retornado. Podemos observar um exemplo de
08 { implementao do Singleton na Listagem 19.
09 public class PessoaFisica:Pessoa
10 {
11 private PessoaFisica(){
12
13 } Alm disso, um mtodo s poder ser definido como abstract se a
14
15 private PessoaFisica(string nome, int idade, string endereco, string estado){
classe em que ele estiver contido for uma abstract, como podemos
16 this.Nome = nome; ver na Listagem 20.
17 this.Idade = idade; Se tentarmos instanciar um objeto do tipo ClasseBase (como no
18 this.Endereco = endereco;
19 this.Estado = estado; cdigo a seguir), obteremos o seguinte erro:
20 }
21 } Cannot create an instance of the abstract class or interface ExemplosFundamentos.
22 } AbstractExemplo.ClasseBase

Listagem 19. Exemplo de construtor privado com Singleton

01 using System; utra caracterstica importante de ressaltar que os mtodos


O
02 using System.Collections.Generic; definidos como abstract precisam obrigatoriamente ser imple-
03 using System.Linq;
04 using System.Text; mentados nas classes descendentes. Alm disso, como existe
05 esta obrigatoriedade, tais mtodos so definidos internamente
06 namespace ExemplosFundamentos.V2
07 {
como virtuais pelo .NET. Na Listagem 21 vemos um exemplo de
08 public class Conexao classe descendente de uma classe abstrata. Observe que se no
09 {
implementarmos o mtodo GerarIdentificador na classe cliente,
10 private static Conexao _conexao { get; set; }
11 obteremos uma mensagem de erro de compilao.
12 public string DataBasePath { get; set; } Segue o erro apresentado caso o GerarIdentificador no seja
13
14 public string UserName { get; set; } implementado na classe descendente.
15
16 public string PassWord { get; set; } ExemplosFundamentos.AbstractExemplo.Cliente does not implement inherited abstract
17 member ExemplosFundamentos.AbstractExemplo.ClasseBase.GerarIdentificador()
18 private Conexao()
19 {
20
21 } Mtodos abstratos so muito comuns quando estamos imple-
22 mentando o design pattern TemplateMethod, que prev a quebra
23 public static Conexao GetInstance(){
24 if(_conexao == null) de pedaos de um determinado algoritmo em partes abstratas,
25 _conexao = new Conexao(); de forma que a classe base no necessite conhecer sua total im-
26
27 return _conexao; plementao, mas apenas o roteiro do mesmo. Na implementao
28 } do template method, a classe base pode ter a implementao de
29 }
30 }
algumas partes de um algoritmo e delegar a responsabilidade de
implementao de outras partes para classes filhas.
Podemos exemplificar o uso do template method na Listagem 22.
Imagine um cenrio hipottico onde teramos a classe venda para
Outro caso muito comum de uso do construtor privado na im- aplicar descontos diferenciados a cada tipo de venda. Por exemplo,
plementao do design pattern Singleton (Nota do DevMan 4). venda a vista teria 10% de desconto e a venda a prazo teria 5% de
desconto. No nosso exemplo, teramos uma classe pai chamada
Modificador Abstract venda e duas classes filhas chamadas VendaVista e VendaPrazo,
Este modificador pode ser aplicado tanto a classes quanto a respectivamente.
mtodos. Quando o utilizamos, estamos dizendo ao .NET que o Observe na Listagem 22 que a classe venda conhece o algoritmo
elemento em questo um elemento abstrato e que no ter im- para calcular o valor lquido de uma venda, mas desconhece o
plementao, ficando a mesma a cargo das classes filhas. Quando algoritmo para calcular o desconto do tipo de venda. Na linha 17,
este modificador usado em uma classe, estamos dizendo que a perceba que fazemos uso do mtodo CalcularDescontoCliente,
mesma no pode ser instanciada. mesmo este sendo abstract (veja na linha 23).

14 Easy .Net Magazine Edio 26


Listagem 20. Exemplo de abstract class Na Listagem 23 temos a implementao deste mtodo nas
classes filhas.
01 using System;
02 using System.Collections.Generic;
03 using System.Linq; Modificador Sealed
04 using System.Text;
05
Este modificador bem simples, pois indica que a classe em ques-
06 namespace ExemplosFundamentos.AbstractExemplo to no pode ser herdada. Caso voc tente criar uma classe filha
07 { de uma Sealed class, obter um erro em tempo de compilao.
08 public abstract class ClasseBase
09 { Na Listagem 24 temos um exemplo de uso da palavra reservada
10 public abstract string GerarIdentificador(); sealed. Neste caso, se tentssemos criar uma classe herdando de
11 }
12 } Produto, obteramos o seguinte erro de compilao:

Listagem 21. Exemplo de abstract class ExemplosFundamentos.SealedClass.ProdutoIndustrializado: cannot derive from sealed
type ExemplosFundamentos.SealedClass.Produto
01 using System;
02 using System.Collections.Generic;
03 using System.Linq;
04 using System.Text; Listagem 23. Exemplo de Template Method - Classes filhas
05
06 namespace ExemplosFundamentos.AbstractExemplo 01 using System;
07 { 02 using System.Collections.Generic;
08 public class Cliente : ClasseBase 03 using System.Linq;
09 { 04 using System.Text;
10 public string Nome { get; set; } 05
11 06 namespace ExemplosFundamentos.AbstractExemplo
12 public string CPF { get; set; }
07 {
13
08 public class VendaVista:Venda
14
09 {
15 public override string GerarIdentificador()
16 { 10 public override double CalcularDescontoCliente()
17 return CPF; 11 {
18 } 12 return 5;
19 } 13 }
20 } 14 }
15
Listagem 22. Exemplo de Template Method - Classe pai 16 public class VendaPrazo : Venda
17 {
01 using System; 18 public override double CalcularDescontoCliente()
02 using System.Collections.Generic; 19 {
03 using System.Linq; 20 return 10;
04 using System.Text; 21 }
05 using ExemplosFundamentos.SealedClass; 22 }
06 namespace ExemplosFundamentos.AbstractExemplo 23 }
07 {
08 public abstract class Venda Listagem 24. Exemplo de sealed class
09 {
10 public DateTime DataVenda { get; set; } 01 using System;
11
02 using System.Collections.Generic;
12 public String Vendedor { get; set; }
03 using System.Linq;
13
04 using System.Text;
14 public IList<Produto> Produtos { get; set; }
15 05
16 public double CalcularValorLiquidoVenda() { 06 namespace ExemplosFundamentos.SealedClass
17 double desconto = CalcularDescontoCliente(); 07 {
18 08 public sealed class Produto
19 double valorTotalProdutos = CalcularTotalProdutos(); 09 {
20 10 public string Descricao { get; set; }
21 return valorTotalProdutos - desconto; 11
21 } 12 public double Valor { get; set; }
22 13 }
23 public abstract double CalcularDescontoCliente(); 14 }
24
25 public double CalcularTotalProdutos(){
26 double total = 0;
27
28 foreach(Produto produto in Produtos){
Outro ponto importante a ressaltar que uma classe marcada
29 total += produto.Valor;
30 } como Abstract no pode ser sealed, visto que a classe abstract
31 necessita de classes descendentes para implementar seus mtodos
32 return total;
33 } abstratos, enquanto que a classe sealed no permite que tenhamos
34 } classes descendentes.
35 }

Edio 26 Easy .Net Magazine 15


Fundamentos bsicos de Orientao a Objetos

Modificador Partial tela (arquivo .designer.cs, gerado pelo Visual Studio) do cdigo
O C# nos permite separar um mesmo tipo, seja uma classe, uma digitado pelo programador(arquivo .cs).
interface ou um struct, em diversos arquivos diferentes atravs do Existem algumas ponderaes importantes com relao ao
modificador partial. Com ele podemos criar uma classe Cliente, modificador partial, sendo elas:
em um arquivo, inserir algumas funcionalidades, e criar o arquivo Se qualquer uma das partes for definida como abstract, Sealed ou
Cliente2 com outros mtodos. herdar de uma classe pai, toda a classe ter tais caractersticas;
Na Listagem 25 ns temos um exemplo de definio de partial Ele s pode ser aplicado s classes, interfaces e structs.
class. Nela temos a definio da classe Fornecedor duas vezes. Ao
compilar este cdigo, o C# ir entender que temos apenas uma Concluso
classe Fornecedor e tanto o mtodo
IsCNPJValido
quanto o m- Neste artigo tivemos uma introduo a alguns conceitos de
todo IsFornecedorEstrageiro estaro presentes na mesma, pois no orientao a objetos, assim como algumas palavras reservadas
final das contas a classe Fornecedor vai ser fruto da combinao do C# que possuem alguma relao com os conceitos abordados
de todas as definies de partial class da mesma. O recurso de de orientao a objetos.
partial class usado pelo prprio .NET na criao de Windows A orientao a objetos um paradigma no to simples de ser
Forms para separar o cdigo referente aos controles inseridos na explicado e compreendido. preciso tempo e dedicao para
conseguir absorver este paradigma e pensar orientado a objetos.
Neste artigo apresentamos alguns conceitos bsicos e fundamen-
Listagem 25. Exemplo de Partial Class tais para novos estudos e avanos no paradigma.
01 using System; Aps compreender os conceitos e fundamentos da orientao a
02 using System.Collections.Generic; objetos, voc pode comear a aplic-los em seus projetos, mesmo
03 using System.Linq; que em pequenos pedaos. Quanto antes voc praticar, mais
04 using System.Text;
05 rpido ir dominar e evoluir no assunto.
06 namespace ExemplosFundamentos.PartialClass A orientao a objetos um pilar do desenvolvimento de
07 {
software atual e as linguagens mais utilizadas hoje se baseiam
08 public partial class Fornecedor
09 { neste pilar. Dominando os fundamentos da orientao a objetos,
10 public Boolean IsCNPJValido() { ficar muito mais fcil para voc aprender C#, Java e qualquer
11 //Validacao de CNPJ
outra linguagem O.O.
12 return true;
13 }
14 } Ricardo Coelho
15
rcoelhorj@gmail.com
16 public partial class Fornecedor
17 { Graduado em Anlise de Sistemas, Ps-graduando em Engenharia
18 public Boolean IsFornecedorEstrageiro() de software, mais de 7 anos de experincia em desenvolvimento de
19 { software, onde atuou em projetos de diversos seguimentos como varejo,
20 //Validacao de Fornecedor Estrangeiro telecomunicaes, ERPs etc e nas mais variadas plataformas(Desktop, Web
21 return true;
22 }
e Mobile). Articulista do portal DevMedia e das revistas ClubeDelphi, easy .NET Magazine
23 } e .NET Magazine. Entusiasta de mtodos geis, atualmente atua como ScrumMaster em
24 projetos de software voltados para a rea de petrleo e gs, alm de se dedicar ao aprofun
25 } damento de seus estudos na rea de GIS e Mobile.

16 Easy .Net Magazine Edio 26


Seo .Net Nesta seo voc encontra artigos bsicos sobre as tecnologias .net

Descobrindo o Windows 8
Entendendo o novo sistema operacional da
Microsoft

A
Microsoft est se recriando e esta evoluo vem Resumo DevMan
da tendncia do falecido Zune, passando pelo
Windows Phone, pelo seu sistema operacional De que se trata o artigo:
(Windows 8) e pelos seus outros produtos. O Windows 8 o novo sistema operacional da Microsoft que foi lanado
O Windows Phone j nasceu com esta nova cara, com recentemente no mercado. Iremos entender quais so as novidades,
o novo conceito de tiles, notificaes, visual mais apri- conceitos, propostas, interaes e veremos um breve exemplo de como
morado e maior ateno usabilidade. O Windows 8 uma app Windows Style.
seguiu os mesmos conceitos, criou uma nova runtime,
mudou velhos paradigmas, trouxe uma nova experin- Em que situao o tema til:
cia e tambm um novo layout chamado inicialmente de Este artigo ser til para todos os profissionais que tenham interesse
estilo Metro, nome que por questes de marca registrada em desenvolver solues para Windows 8, abordando detalhes que
foi alterado para Windows style. devemos estar atentos ao construir apps para esta nova plataforma,
alm das oportunidades que esto surgindo com a loja de aplicativos
Entendendo o Windows 8 do Windows 8, a Windows Store.
Com a chegada dos tablets e smartphones entrou em
cena um novo conceito e uma nova viso de aplicao Descobrindo o Windows 8:
onde temos agora dois mundos: um que tinha uma in- O Windows 8 a grande novidade e a grande aposta da Microsoft para
terao j conhecida h bastante tempo com o modelo este ano, ento vamos entender o que o novo estilo do Windows, a arqui-
de entrada baseado em teclado e mouse e outro que esta tetura que foi criada para que este estilo se torne possvel, as tecnologias
sendo criado com interao de touch e novos conceitos utilizadas, os cuidados em desenvolver uma app para este novo conceito,
de usabilidade. alm de questes de usabilidade e layout.
O grande choque inicial do Windows 8 ver o novo
estilo. Juntaram o velho conceito que j tnhamos com
uma nova possibilidade de aplicao e interao. Vamos
entender o que h de novo:
W indows Style: Nome para o novo estilo de interface
do Windows 8 que j esta sendo tendncia de mercado.
Podemos ver o modelo de aplicao e de tiles (blocos
dos aplicativos) sendo aplicado em algumas solues e
tambm em alguns sistemas web. As Windows apps so
aplicativos bem mais desenhados, com ateno maior
ao design e a usabilidade da aplicao. Podemos ver um
exemplo do windows style na Figura 1.

A tela principal agora est divida em blocos, chamados


de Tiles. Cada tile pode representar um aplicativo onde
Figura 1. Windows Style - tela principal
voc pode definir o que deseja ver na tela principal.
Cada aplicativo responsvel por determinar o que ser
exibido em sua tile, que pode ser atualizada em tempo a do Windows 7. A diferena principal est no boto iniciar. No
real, como nos casos de aplicativos de previso do tem- novo desktop, ao acionarmos a opo iniciar, somos levados para
po, notcias, redes sociais e emails. Umas das tiles desta a tela principal do windows 8 (Figura 1).
tela a desktop. Acessando esta tile ns iremos para a Novas barras: A Microsoft inseriu novas barras com algu-
rea de trabalho do windows 8, que muito similar com mas funcionalidades de acordo com o seu propsito, sendo

Edio 26 Easy .Net Magazine 17


Descobrindo o Windows 8

duas barras principais, uma para interao com o sistema ao computador como impressoras, discos externos, monitores,
operacional (Charms Bar) e outra para interao diretamente dentro outros, conforme podemos ver na Figura 5.
com os apps(App Bar).
Charms Bar a principal toolbar do Windows 8 fornecendo
acesso aos principais recursos do mesmo. Para acessar a mesma
basta deslizarmos o mouse sobre o canto superior ou inferior di-
reito ou apertar o atalho Win + C. Esta barra est disponvel tanto
em pcs quanto em tablets. Podemos ver um exemplo da charms
bar na Figura 2.

Figura 4. Opo de compartilhamento

Figura 2. Exemplo da Charms Bar

Como podemos ver na Figura 2, a charms bar nos fornece as


seguintes opes:
- Pesquisar Esta opo basicamente a mesma busca j existente
no menu iniciar do Windows 7, com diferena para o layout e para
performance que est melhor do que na verso antiga, conforme
podemos ver na Figura 3. Figura 5. Opo de dispositivos

- Configuraes Nesta opo podemos acessar as configu-


raes do dispositivo, tanto de ajustes de hardware e software
(configuraes de udio e wireless), como tambm configuraes
relativas customizao do Windows, conforme podemos ver
na Figura 6.
App Bar Esta a barra de opes para voc interagir direta-
mente com as aplicaes. Para acess-la no computador clique
com o boto direito do mouse ou acesse pelo atalho Win + Z. No
caso de estar usando um dispositivo touchscreen, basta passar o
dedo na parte inferior ou superior da tela. As opes da App Bar
so especficas de cada aplicao. Por exemplo, se voc estiver
Figura 3. Opo Pesquisar acessando um aplicativo de bolsa de valores, voc pode ter as
opes de consultar uma cotao, visualizar o grfico do dia, etc.
- C ompartilhar Esta opo permite que voc compartilhe Estas opes so definidas no desenvolvimento do app. Podemos
informaes via email ou mdias sociais. Ao acionar esta opo ver um exemplo da app bar na Figura 7.
sero exibidos os aplicativos que permitem compartilhamento
de alguma informao. Somente apps especficas, que possuem Introduo ao WinRT
as permisses necessrias, podem ter esta opo de comparti- O WinRT a nova runtime do Windows Style. Na Figura 8
lhamento, conforme podemos ver na Figura 4. temos um diagrama onde podemos ver a arquitetura do mesmo.
- Iniciar Acessa a tela inicial do Windows 8. O WinRT no simplesmente um framework para construir apps
- Dispositivos Exibe todos os dispositivos que esto conectados para windows 8, mas sim uma reviso nos conceitos da Microsoft

18 Easy .Net Magazine Edio 26


sobre como a mesma quer que os desenvolvedores interajam com Possuem armazenamento isolado, ou seja, no compartilham
as APIs e drivers do Windows. recursos de memria com outros aplicativos.
Antes do WinRT, a grande mudana da Microsoft com relao So instalados em um nico diretrio.
interao com o S.O foi o lanamento do .NET Framework. O Exigem autorizao do usurio para acessar o sistema de arqui-
.NET funciona como uma camada acima da API do Windows, vos, tornando-os mais seguros.
a Win32. Isso quer dizer que se desenvolvermos um aplicativo
para abrir um arquivo em .NET, usaramos a classe FileStream e
esta classe faria uma chamada ao OpenFile da API do Win32. Ou
seja, mesmo acessando recursos da framework .NET passaramos
pela API Win32.

Figura 8. Arquitetura WinRT

O WinRT tem um modelo de aplicao e trs categorias que so


expressas por APIs que so definidas como:
Communication & Data - API de comunicao e acesso a da-
Figura 6. Opo de configuraes dos, responspvel, por exemplo, pela interao da aplicao com
arquivos e diretrios
Graphics & Media - API responsvel pelos estilos e renderizao
dos layouts.
Devices & Printing - API responsvel pela interao com dis-
positivos de hardware e impressoras.

Nota do DevMan 1
O XAML (Extensible Application Markup Language) uma linguagem declarativa baseada em XML
criada pela Microsoft. Ela j utilizada em algumas tecnologias Microsoft, como por exemplo:
- Windows Presentation Foundation (WPF) e Silverligth - Usada para construo de interfaces com o
usurio, ligao de dados e eventos.
Figura 7. AppBar - Windows Workflow Foundation (WWF) - Usada para definir os fluxos de trabalho.
Tudo o que criado ou implementado em XAML pode ser feito atravs de uma linguagem mais
No diagrama da Figura 8 temos a separao entre Metro Style tradicional, mas um dos aspectos fundamentais da tecnologia a baixa complexidade, por ser
Apps (Windows Style) e Desktop Apps, onde podemos observar baseada em XML.
que as aplicaes Windows Style fazem uso da nova runtime No caso do Windows 8, ela pode ser usada para criarmos interfaces com o usurio no Windows Style.
possibilitando que aplicaes desenvolvidas em C, C++, C#, VB e
javascript rodem diretamente na mesma. Alm disso, na cama-
da de visualizao temos a famosa combinao HTML/CSS e o Design de aplicaes Windows 8
XAML (Nota DevMan 1). Do outro lado, nas Desktop Apps, temos Com o Windows 8 samos de um padro antigo de layout para
o cenrio atual, com aplicaes javascript rodando no browser um mundo novo com muito mais apelo ao design e usabilidade.
(Internet Explorer), C e C++ rodando diretamente na API Win 32 Para confirmar esta deficincia do antigo layout, a Microsoft fez
e C# e VB rodando no framework .NET (que por sua vez faz acesso uma pesquisa em Redmond pedindo para que em pouco tempo
API Win32). as pessoas desenhassem o programa que mais utilizavam, ainda
Os aplicativos que so criados para o WinRT possuem algumas dentro do antigo sistema operacional Windows 7.
caractersticas, sendo elas: Observando a Figura 9 podemos ver que o resultado foi que
Eles no podem destruir outros aplicativos. as pessoas desenharam mais elementos do sistema operacional,

Edio 26 Easy .Net Magazine 19


Descobrindo o Windows 8

sendo possvel notar a barra de ferramentas, botes, janela que tambm segue nos tablets que a chamada snap view, como
etc. No foi mencionado que o desenho seria do sistema podemos ver na Figura 12.
operacional, mas sim da aplicao que mais usa. Ento com A snap view a possibilidade de uma app Windows Style ficar
este exerccio percebemos que o sistema operacional retira um alocada em um pedao da tela, podendo ficar no canto direito ou
pouco a ateno e o foco que deveria ser da aplicao e de seu esquerdo da mesma. Com este conceito podemos ter duas aplica-
respectivo contedo. O papel do sistema operacional entregar es rodando ao mesmo tempo na tela, uma com uma parte menor
a aplicao ao usurio e no ser um influenciador direto no (a snap view) e outra com uma parte bem maior.
seu layout. J no Windows Style, o resultado foi diferente: as
pessoas que tiveram vivncia com ele, desenharam algo que
evidenciou mais as aplicaes (tiles), sem nenhum desenho
de recursos do sistema operacional como barras e botes do
mesmo, como podemos ver na Figura 10.

Figura 11. Giro de tela no tablet

Figura 9. Desenho aplicao desktop Figura 12. Exemplo de snap view

Diante deste cenrio, ns programadores temos que tratar estes


giros (se a app for habilitada para isso) e tambm a nova tela
(snap) da melhor forma possvel, vendo como a app se comporta
e tratando as aes da melhor forma possvel.
Por exemplo, alguns games j feitos para o Windows 8, quando
esto na tela de snap, costumam pausar o jogo automaticamente,
isso significa que talvez o desenvolvedor do game tenha percebido
que no seria possvel jogar o mesmo em uma span view ou tenha
visto que isso comprometeria muito a usabilidade do mesmo e fez
com que o jogo fosse pausado quando colocado na snap view.

Usabilidade
H um foco muito grande tambm na usabilidade da app, pois
importante que haja uma combinao entre design e usabilidade.
Figura 10. Desenho app Windows Style necessrio pensar em todas as possibilidades, em como ser a
exibio da informao, a localizao da mesma, as animaes,
Tratamento de telas as transgresses de uma informao para outra, a usabilidade em
Como estamos vivenciando dois mundos (tablets + PCs), o tela touch e com o mouse.
Windows 8 tem algumas novidades com relao aos tipos de O Windows 8 segue esta movimentao padro, vide Figura 13,
tela como mostrado na Figura 11. onde acontece o click na tile (o boto do Windows Style), ento
No tablet temos o conceito de giro, ou seja, podemos ter a tela visualizada a splash screen (tela inicial, onde aguardamos o inicio
na horizontal (Landscape) e na horizontal de cabea para baixo da app) e ento a informao exibida.
(Landscape-flipped) e temos tambm na vertical (Portrait). J A usabilidade est to forte nessas aplicaes que necessrio pen-
nos PCs ns no temos estes giros mas temos um novo conceito sar tambm onde a app ir rodar, pois podemos estar em um PC ou

20 Easy .Net Magazine Edio 26


em um tablet e isso tambm influencia muito no desenvolvimento de um projeto em branco e entender a sua arquitetura, seguindo
da app, sendo necessrio pensar em aspectos como o tamanho e os passos de gerao de uma nova app:
estilo de fonte, alinhamento do ttulo, alinhamento com a margem 1. Arquivo => Novo Projeto (Ctrl+Shift+N). A caixa de dilogo
esquerda por causa dos dedos no touch da tela, a movimentao que Novo Projeto ser exibida. O painel esquerdo da caixa de dilogo
pode ser feita na tela de touch e no PC no... ou seja, existem diver- permite selecionar o tipo dos modelos que sero exibidos.
sos novos fatores e variveis, a nvel de visualizao, informao e 2. No painel esquerdo, acesse Instalado => Visual C# e selecione
hardware, que podem dificultar a usabilidade da app. o tipo de modelo Windows Store. O painel central da caixa de
dilogo exibir uma lista dos modelos de projeto para aplicativos
Windows Style, onde voc dever escolher a opo Aplicativo em
Branco (Blank App).
Este modelo cria um aplicativo Windows Style bsico que pode
ser compilado e executado, mas que no contm controles de
interface e nem de dados, como podemos ver na Figura 14.
Na Figura 15 temos a estrutura do projeto recm criado. Vamos
compreender cada um destes elementos:
Pasta Properties: Contm a classe AssemblyInfo com a mesma
ideia do AssemblyInfo do Windows Form Application (.NET),
Figura 13. Exemplo de interface e movimentao padro
onde temos uma srie de propriedades do assembly, como verso,
empresa, descrio etc.
References: Contm as dlls que esto sendo referenciadas pelo
Tutorial nosso projeto.
Assets: Contm as imagens que sero utilizadas. Para o
Windows Style j criado um padro que contm a imagem da

Windows Store
Seguindo as tendncias vindas da Apple (ITunes) e da Google
(Play Store), a Microsoft se viu diante da necessidade de fornecer
um meio para que seus desenvolvedores pudessem disponibilizar
suas aplicaes diretamente para milhes de usurios. Com isso, a
Microsoft criou a Windows Store que uma plataforma de distri-
buio de aplicaes baseadas em WinRT usado pelo o Windows 8.
pela Windows Store que os desenvolvedores podero distribuir
suas aplicaes, sendo elas gratuitas ou pagas.
Esta uma excelente oportunidade para os desenvolvedores, pois
agora possvel ter acesso mais fcil aos usurios finais, pois os
usurios s iro se dirigir para um nico lugar (Windows Store)
em busca de apps.

Nota

Tecnologias que sero utilizadas nos exemplos e na explicao do contedo: Windows 8 final e Visual
Studio 2012, visualizao com XAML e codificao com C#.

Vamos comear a entender um pouco mais do desenvolvimento


de uma soluo Windows Style. Como o foco do artigo no em
desenvolver um aplicativo para Windows 8, mas sim demonstrar
as novidades do mesmo, iremos apresentar dois modelos de
aplicao do visual studio (blank / grid), e vamos criar um app
bsico apenas para ilustrar este processo de desenvolvimento.

Windows Apps Modelo em branco no Visual Studio


Partindo de um ambiente j pronto para o desenvolvimento,
com Visual Studio 2012 instalado, vamos seguir com a gerao

Edio 26 Easy .Net Magazine 21


Descobrindo o Windows 8

logo da app, a imagem reduzida da logo ( uma das funes das


tiles, voc pode diminu-las para um quadrado ou aument-
las para um retngulo), a SplashScreen (imagem que aparece
Nota do DevMan 2
quando a app iniciada) e a logotipo que dever aparecer da
O ClickOnce facilita a instalao de aplicaes no Windows resolvendo trs problemas comuns de
Windows store; instalao que a dificuldade em atualizar um aplicativo instalado, o impacto de um aplicativo no
computador do usurio e a necessidade de permisses de administrador para instalar aplicaes.

Package.appxmanifest: Arquivo manifest de configurao da


app. Descreve seu aplicativo (nome da app, descrio, tile, pgina
inicial e assim por diante) e lista os arquivos que seu aplicativo
contm.

Windows Apps Modelo em grid no Visual Studio


Outro modelo de aplicao do VS o modelo em grid. Temos
tambm o Split app, mas esta soluo segue o mesmo entendi-
mento do grid, ento iremos focar apenas no grid app.
Esta soluo j tem o espaamento especfico, o padro de app,
Figura 14. Novo projeto gerado de layout e todos os controles j definidos. Para gerar a app em
grid, vamos seguir os passos novamente:
1. Arquivo > Novo Projeto (Ctrl+Shift+N). A caixa de dilogo
Novo Projeto ser exibida. O painel esquerdo da caixa de dilogo
permite selecionar o um dos modelos disponveis.
2. No painel esquerdo, opo Instalado => Visual C#, selecione
o modelo Windows Store. O painel central exibir uma lista dos
modelos de projeto para aplicativos no Windows Style. Selecione
o Grid App (XAML), escolha o nome da app e clique em ok.

Na Figura 16 temos a estrutura inicial de nosso projeto baseado


em grid. Ele bem parecido com o projeto em branco gerado
anteriormente, mas com alguns arquivos adicionais. J na pasta
Common temos as classes necessrias para o projeto implemen-
tando classes que tornam possvel o modelo de app em grid.
No DataModel temos o contedo de dados, o projeto j vem
com uma base para que seja exibido algo na tela e tudo vem
desta pasta.
Alm disso, nesta solution ns temos:
GroupedItemsPage.xaml: a primeira tela do exemplo onde
esto os itens que podem ser clicados e tambm os grupos que
Figura 15. Estrutura do projeto gerado pelo Visual Studio podem ter suas prprias informaes. Note que existem grupos
e itens e que um grupo pode ter vrios itens;
Common: Contm os estilos padres (StandardStyles). Fazendo GroupDetailPage.xaml: Definio do grupo, onde temos o
um comparativo, esta classe parecida com o CSS de uma pgina ttulo, a definio e os itens que o mesmo possui;
web, pois contm informaes para o template de algum compo- ItemDetailPage.xaml: E finalmente temos a definio do item
nente, pgina, etc; propriamente dito com uma imagem e os textos;
App.xaml: Este item o responsvel pela inicializao da apli- Estas so duas formas de criar uma app, usando um projeto
cao. Podemos traar um paralelo dele com a classe program do em branco ou usando o padro em grid. Agora criaremos uma
Windows Form Aplication. nela que a app iniciada e onde aplicao de exemplo e daremos sequncia com a publicao dela
executamos a primeira pgina; na Windows Store.
NomedaAplicao_TemporaryKey.pfx: Chave temporria
gerada automaticamente pelo Visual Studio. Esse arquivo uma Criando nossa app Windows Style
chave de criptografia (certificado digital) para assinatura de um Vamos desenvolver uma app Windows Style. O objetivo desta
pacote de instalao do ClickOnce (Nota DevMan 2). app ser nos dizer qual tipo de combustvel devemos usar em

22 Easy .Net Magazine Edio 26


um carro flex diante da meno do preo da gasolina e do alcool.
Nossa aplicao ter um layout semelhante ao da Figura 17.
Sabemos que a gasolina rende mais que o lcool, ou seja, com
1 litro de gasolina o carro anda mais do que com 1 litro de lcool.
O clculo bem simples, basta multiplicar o valor da gasolina
por 0,7 e se o resultado dessa multiplicao for inferior ao preo
do lcool, ser vantagem abastecer com gasolina. Caso contrrio,
se o valor da operao for superior ao do lcool, ser melhor
abastecer com lcool.

FairCom101206BRhalffinal.pdf 1 2/9/11 3:19 PM

Figura 16. Estrutura do projeto em grid gerado pelo Visual Studio Figura 17. App gasolina x alcool

SQL E Isam Uma


Combinao De Sucesso!
Deixe o sistema de sua empresa mais leve e rpido. Conhea as
novidades do c-tree e faa toda a diferena!
U ADICIONE processamento de transaes, recuperao automtica,
backups dinmicos e replicao aos seus aplicativos.
on rati

U AMPLIE sua escolha de APIs com C, C++, .NET, ODBC, JDBC, PHP e SQL.
Corpo

U FAA como muitas empresas no mundo todo, lderes em diversos


Com

segmentos como finanas, telecomunicaes e sade, que tm baseado


1 Fair

suas solues crticas na tecnologia c-tree.


201

the right-size Database

Baixe seu SDK grtis


v>VVUnn

Edio 26 Easy .Net Magazine 23


Descobrindo o Windows 8

Vamos a um exemplo: preo da gasolina = R$ 2,50, ento 2,50 Listagem 2. Code behind da MainPage
X 0,7 = 1,75. Nesse caso, o lcool para ser vantajoso teria que
01 private void btnProcessar_Click(object sender, RoutedEventArgs e)
custar at R$ 1,75. Neste exemplo, seguiremos os passos que j 02 {
conhecemos de gerao de uma soluo em branco. 03 string mensagem = AlcoolouGasolina(float.Parse(txtAlcool.Text),
1. Depois da criao da soluo, vamos inserir os compo- float.Parse(txtGasolina.Text));
04 //Mtodo de exibio de mensagem na tela.
nentes necessrios para desenvolver a aplicao, para isso, 05 Windows.UI.Popups.MessageDialog msg = new Windows.UI.Popups.
vamos editar a parte visual da MainPage.xaml, clicando MessageDialog(mensagem);
com o mouse em cima da MainPage e com o boto direito 06 msg.ShowAsync();
07 }
na opo view designer, ou shift + F7, de forma que fique
como na Listagem 1. 08 private string AlcoolouGasolina(float alcool, float gasolina)
Na Listagem 1 podemos ver que inclumos dois campos 09 {
10 //multiplicao da gasolina por 0,7
de texto e um boto para executar nossa rotina de clculo do 11 //e teste se o valor menor ou igual ao do alcool
combustvel. interessante notar que a sintaxe do XMAL 12 if ((gasolina * 0.7) <= alcool)
13 {
bem intuitiva e at parecida com os ASPX do ASP.NET, visto
14 return Abastecer com lcool;
que ambos so baseados em XML. 15 }
16 else return Abastecer com gasolina;
Nota 17 }

Este exemplo tem como objetivo mostrar ao leitor a parte cdigo de uma app Windows Style. Note
que questes que j discutimos como layout, animaes e usabilidade, no esto sendo aplicados.
No caso de um projeto real, estes quesitos precisam receber mais ateno, visto que este exemplo
apenas para fins didticos.

Listagem 1. XAML da MainPage

<Grid Background={StaticResource ApplicationPageBackgroundThemeBrush}>


<TextBlock Text=lcool x Gasolina FontSize=48 FontFamily=Segoe UI
Margin=79,45,894,667 />
<TextBlock Text=Valor do lcool: FontSize=22 FontFamily=Segoe UI
Margin=414,231,800,504 />
<TextBox x:Name=txtAlcool HorizontalAlignment=Left Margin=587,232,0,0
TextWrapping=Wrap VerticalAlignment=Top Height=29 Width=225/>
<TextBlock Text=Valor da gasolina: FontSize=22 FontFamily=Segoe UI
Figura 18. Depurao da app
Margin=398,286,800,449 />
<TextBox x:Name=txtGasolina HorizontalAlignment=Left
Margin=587,286,0,0 TextWrapping=Wrap VerticalAlignment=Top
Height=29 Width=225/> a publicao. Aqueles que so parceiros da Microsoft e possuem
<Button x:Name=btnProcessar Content=Processar assinatura MSDN(MSDN subscribers)j receberam gratuitamente
HorizontalAlignment=Left Margin=714,366,0,0 VerticalAlignment=Top um token, que pode ser conferido na lista de benefcios.
Click=btnProcessar_Click/>
</Grid> Para criar a sua conta na Windows Store atravs do Dev Center
do MSDN (confira na seo Links).
necessrio tambm que acesse sua dashboard e reserve o
2. Agora vamos editar a parte cdigo da MainPage, clicando nome da sua App. Isso pode ser feito antes mesmo de iniciar a
com o mouse em cima da MainPage, e com o boto direito na codificao, como mostrado na Figura 19.
opo view code, ou F7, seguiremos o exemplo de forma que
fique como o cdigo da Listagem 2. Processo no Visual Studio 2012
3. Ento vamos ver a aplicao rodando. Para ver sua aparncia Para publicar uma app no Windows Store temos que seguir
final pressione F5 para compilar e executar o aplicativo como alguns passos no Visual Studio. Com a app criada, necessrio
mostrado na Figura 18. clicar no Solution Explorer ecom o boto direito selecionar Store
e em seguida Associate App with Store (Figura 20).
Publicao de uma app no Windows Store Depois disso, uma janela ser aberta para facilitar o processo
Antes da liberao do Windows 8 para o mercado, as apps do upload e associao com sua conta na Windows Store, onde
passavam por alguns testes dentro da Microsoft para serem o primeiro passo fazer o Sign In. Se voc j criou um nome
publicadas. para sua App, ela ser exibida na prxima tela. Clicando em
Agora este processo ficou mais simples, as apps no passam Associate conclumos o vnculo entre o nosso projeto e a Windows
mais por estes processos, sendo preciso apenas ter o token para Store, com o nome da App j reservada.

24 Easy .Net Magazine Edio 26


Processo na Windows Store
De volta a Windows Store, a app ser
exibida na lista de itens, mas ainda
necessrio algumas configuraes.
Clicando em Edit, necessrio definir
algumas coisas importantes como deta-
lhes da venda da App, criptografia, faixa
etria apropriada, dentre outros. Vamos
ver cada tpico e ter uma ideia do que
cada um significa:
Detalhes de vendas: Neste ponto so
realizadas as definies de venda da app.
Aqui possivel escolher uma margem entre
R$ 2,49 at R$ 1.709,99, o perodo de ava-
liao gratuita (que vai de App nunca
expira at 1, 7, 15 ou 30 dias), os pases
que a app pode ser comercializada, o Figura 20. Incio do processo de publicao da app
nvel mnimo do DirectX e memria
RAM exigida. Tambm possvel definir
data de lanamento da app e a categoria
que ela estar disponvel.
Recursos Avanados: Definio das
informaes relacionadas a servios de
notificao (Push Notification). Contm
uma rea de Ofertas no Aplicativo onde
possvel fazer venda de itens at mesmo
dentro de outra app.
Classificao Etria e Certificados de
Classificao: Para definio de classifi-
cao etria necessrio saber que exibir
imagens que possam causar choque em pes-
soas sensveis (como desmembramentos,
execues e coisas do gnero so proibidos).
Figura 19. Reservando o nome da app
Atividade sexual pode estar relacionada ao
contexto da App ou Game, mas no pode ser ela foi obtida atravs de padres preestabelecidos. Para mais
explcita. Nudez permitida, mas no de natureza sexual. informaes, acesse o site do BIS - Bureau of Industry and
A classificao mais alta de 16+.Ela contempla retratar vio- Security, na seo Links.
lncia real com mnima exibio de sangue, alm de atividade Pacotes: Para gerar algum pacote necessrio voltar novamente
sexual no contexto. Tambm pode conter cenas de uso de drogas ao Visual Studio. Parecido com o que fizemos no incio, agora
ou cigarro e atividades criminais, alm de mais material vulgar iremos clicar com o boto direito em cima do projeto, Store e
do que o permitido em um aplicativo 12+. Voc pode acessar o selecionar Create App Packages para ento criar o pacote.
portal da Imprensa Nacional na seo Links. Pode ser que seja necessriofazer oSign in novamente para em
Em regras gerais, caso no deseje se aprofundar no tema, seguida escolher um diretrio para o output, alm de definir o
recomenda-se que escolha somente 3+ ou 7+ quando o aplicativo nmero da verso e o tipo de arquitetura como target.
for para crianas. Se tudo estiver certo, uma tela de sucesso ser exibida junto com
Falando especificamente sobre Games, para a Coria, frica do a sugesto de executar o WACK (Windows App Certification Kit)
Sul, Taiwan e Brasil, preciso submeter tambm um arquivo de que ir verificar se o App ou Game est pronto para ser distribudo
certificado (DJCTQ). via Windows Store, rodando uma bateria de testes no mesmo.
Criptografia: Se a sua App possui qualquer uso de assinatura Depois disto, necessrio voltar a Windows Store, selecionar o
digital, criptografia de senhas ou outras formas de segurana arquivo com a extenso appxupload e arrastar para a caixa de
da informao preciso declarar que voc est fazendo uso de carregamento de pacotes.
criptografia. Esta uma exigncia governamental onde voc, Descrio: Neste ponto ser editada a descrio, palavras-chave,
declarando que faz uso de criptografia, precisar garantir que recursos do aplicativo, descrio da atualizao (se for um update

Edio 26 Easy .Net Magazine 25


Descobrindo o Windows 8

do seu aplicativo), informaes sobre direitos autorais, marcas nvel de aplicaes. Como tambm uma nova proposta de mer-
registradas, etc. cado para desenvolvedores independentes, dando mais espao e
Em seguida, voc encontrar uma rea de captura de tela onde possibilidades aos mesmos.
pelo menos uma imagem necessria. A imagem precisa ter uma Contudo, seguindo a evoluo, agora podemos ter aplicaes
legenda com no mximo 200 caracteres.Um png de nomnimo ricas combinadas com outros dispositivos que j conhecemos,
1366 x 768 ou 768 x 1366 pixels e no mximo 2 MB. entregando assim novas possibilidades e novas maneiras do
Observaes aos Testadores: Neste ponto onde fornecemos usurio estar conectado ou com suas informaes disponveis
informaes aos testadores para que testem a app ou o game com da melhor maneira.
facilidade, agilizando o processo de certificao e publicao. Se o Ento, podemos assim ter aplicaes em desktop, tablets, smar-
aplicativo precisa acessar um servio, bom fornecer o nome de tphone, web e tambm seguir com conceitos de computao em
usurio e a senha por exemplo. Se o aplicativo tiver recursos no nuvem com as tecnologias de Windows Azure da Microsoft, que
to bvios para os testadores, aconselhado que descrevacomo pode ser consumida por todos os dispositivos e tambm acessada
acessar os mesmos. O importante que o testador tenha em mos via web.
tudo o que necessrio para testar sua App. Agora aproveitar este novo mercado de apps, as oportunidades
Com esta etapa concluda, pode ser que voc tenha que passar que esto surgindo e explorar cada vez mais este novo mundo
pela Verificao da conta de pagamento. Este um sistema de chamado Windows8.
validao do seu carto de crdito. Um valor mnimo cobrado
para concluir esta verificao. Para isto, voc precisar inserir
Titao Yamamoto Jnior
o valor cobrado na transao ou ento o cdigo de 3 dgitos da
titaoyamamoto@gmail.com titaoyamamoto.com
transao. Estes dgitos provavelmente so exibidos no extrato
Bacharel em cincias da computao, Ps-graduando MBA em
da sua conta. Engenharia de Software e Microsoft Student Partner.
Se a verificao j foi concluda e voc concluiu todas as etapas
at aqui, ento a app provavelmente estar sob testes. Esta etapa
pode durar uma mdia de sete dias. Voc receber um e-mail de
confirmao do servio. Bis - Bureau of Industry and Security
http://www.bis.doc.gov/encryption/default.htm
Concluso
Podemos concluir que a Microsoft inovou e evoluiu bastante Imprensa Nacional
nesta nova verso do seu sistema operacional, podemos ver que http://portal.in.gov.br/
essa evoluo no veio de repente nesta verso mas sim de uma Dev Center MSDN
evoluo de anos das suas tecnologias, considerando usabilidade, http://msdn.microsoft.com/windows/apps
design e tendncias de mercado.
Com essa inovao, grandes empresas tm tecnologia suficiente Download do Visual Studio 2012
para evoluir os seus aplicativos nativos passando para um novo http://www.microsoft.com/visualstudio/ptb/downloads

26 Easy .Net Magazine Edio 26


Seo .Net Nesta seo voc encontra artigos bsicos sobre as tecnologias .net

Primeiros passos
com o namespace
System.IO Parte 2
Manipulao de arquivos
Este artigo faz parte de um curso Resumo DevMan
De que se trata o artigo:
O artigo apresenta as classes que o .NET framework possui para reali-

A
s tarefas de manipulao de arquivos so mui- zarmos manipulao de arquivos gravados no sistema operacional ou
to comuns no dia a dia dos desenvolvedores, arquivos/informaes alocados na memria do computador, utilizando
porm, muitas vezes o desenvolvedor acaba prticas que podem melhorar o desempenho e manter a segurana
reinventando a roda por desconhecer os recursos nas atividades relacionadas a operaes IO (entradas e sadas) em
nativos do framework para lidar com arquivos, sejam aplicaes .NET.
eles fsicos ou em memria.
Neste artigo vamos estudar como uma aplicao pode Em que situao o tema til:
utilizar o .NET framework para manipular arquivos de Sempre que for preciso editar, criar ou excluir algum arquivo hospedado
maneira eficiente. no sistema operacional, ou manter dados gravados temporariamente na
Para podermos realizar a manipulao de arquivos, memria do computador, obtendo o mximo de performance no trabalho
precisamos primeiro entender como funciona o mecanis- com dados de diversos formatos.
mo de transferncia de dados gravados para a aplicao
que est solicitando os mesmos, e vice versa. Primeiros passos com o namespace System.IO Parte 2:
Para que esta transferncia de dados seja possvel, Neste artigo veremos os principais conceitos e classes relacionados
o .NET possui uma srie de classes que derivam de leitura e escrita de arquivos em .NET. Abordaremos a classe base
uma classe base, chamada Stream. Um Stream pode ser Stream e suas principais classes concretas como, por exemplo, FileStream,
classificado como o objeto que realiza a conexo entre a MemoryStream, BufferedStream, StreamReader e StreamWriter, apresen-
aplicao que est necessitando manipular os dados e a tando seus principais mtodos e exemplificando seu uso.
fonte onde estes dados esto armazenados seja no disco
rgido, na memria, na internet, no prprio teclado etc.
Streams no se limitam apenas a trabalhar com arquivos,
mas tambm so aplicados nas transferncias de dados classe Stream tambm est localizada no namespace System.IO e
como vdeos, imagens, voz ou outros que necessitem de possui as propriedades apresentadas na Tabela 1 e os mtodos
transmisso de uma fonte origem para algum destino. apresentados na Tabela 2.
A principal funo dos Streams permitir a interao A Figura 1 ilustra como que os diferentes tipos de Streams
da aplicao com elementos externos. contidos no .NET se relacionam para fornecer uma estrutura
Vamos conhecer agora as principais propriedades e organizada de leitura e gravao de dados em diversas fontes
mtodos implementados pela classe abstrata Stream, de dados e tambm algumas classes de leitura (reader) e escrita
disponibilizada como classe base para todos os Stre- (writer) que servem de apoio para o trabalho com Streams. Durante
ams disponveis no .NET framework. Assim como as este artigo veremos os principais e mais utilizados Streams e suas
demais classes disponveis para manipulao I/O, a classes de apoio.

Edio 26 Easy .Net Magazine 27


Primeiros passos com o namespace System.IO Parte 2

Propriedade Descrio
CanRead Esta propriedade determina quando o Stream suporta leitura de dados.
Esta propriedade determina quando o Stream suporta seeking, que uma busca de uma posio no Stream. Atravs do Seek podemos
CanSeek
posicionar o cursor de leitura ou gravao em um determinado local e ler ou gravar a partir deste ponto.
CanTimeOut Determina se o Stream possui um Timeout, ou seja, se a operao atual com o Stream pode expirar depois de determinado tempo.
CanWrite Determina se o Stream permite gravao de dados (escrita).
Length Esta propriedade retorna o tamanho do Stream em bytes.
Retorna e permite informar qual a posio do cursor no Stream. Esta posio no pode ser maior que o tamanho retornado pela proprieda-
Position
de Length.
ReadTimeout Informao de qual o tempo limite para operaes de leitura do Stream.
WriteTimeout Informao de qual o tempo limite para operaes de gravao (escrita) do Stream.

Tabela 1. Propriedades da classe Stream

Mtodo Descrio
Close Fecha o Stream e libera todos os recursos associados a ele.
Flush Limpa qualquer buffer (Nota do DevMan 1) existente para o Stream e fora as alteraes para que sejam gravadas na fonte de dados.
Este mtodo executa uma leitura sequencial no Stream a partir da posio atual do cursor no Stream, conforme o nmero de bytes definido,
Read
atualizando esta a posio do mesmo aps a leitura.
Executa a leitura de apenas um byte no Stream, partindo da posio atual e atualizando esta posio aps a leitura. o mesmo que executar
ReadByte
o mtodo Read passando como parmetro apenas um byte.
Seek Mtodo que permite definir a posio do cursor no Stream, sem necessidade de se realizar a leitura at esta posio.
Define o tamanho do Stream. Caso o tamanho informado seja menor que o tamanho de dados contido no Stream, este ser truncado. Se o
SetLength
tamanho for maior, o stream ser expandido para o novo tamanho.
Mtodo que permite a gravao de informao no Stream informando o nmero de bytes desta informao e atualizando o cursor para a
Write
nova posio aps a gravao.
WriteByte Realiza o mesmo que no mtodo Write, com a diferena que grava apenas um byte no Stream.

Tabela 2. Mtodos da classe Stream

Nota do DevMan 1
buffer o termo utilizado para denominar uma regio da memria do computador que est
alocada para o armazenamento temporrio de dados, sendo possvel realizar leituras e gravaes
neste espao.

Classes de Apoio para Streams


Classes de apoio so classes que fornecem servios para facilitar
o trabalho com determinados tipos de objetos.

Classe File
Com a classe File podemos realizar uma srie de operaes
com arquivos como a leitura e escrita de contedo, a criao Figura 1. Streams do .net framework e classes de apoio para leitura e escrita.
ou abertura com permisses de somente leitura/escrita, a ve- (Fonte: http://www.cnblogs.com/erebus/articles/2176646.html)
rificao se o arquivo pesquisado existe, excluso de arquivos,
dentre outras. Ela tambm auxilia o trabalho com os Streams
pelo fato de possuir alguns mtodos especficos que retornam classe File tambm possui mtodos que retornam Streams mais
instncias de classes do tipo Stream j abertas e prontas para a especficos, como o objeto StreamReader, que um objeto que
utilizao. O objeto Stream mais bsico retornado pela classe File tambm representa um arquivo, porm com permisses de
o objeto FileStream, que vamos estudar profundamente mais somente leitura dos dados.
a frente e que representa um arquivo do sistema de arquivos Para entender melhor como que esta classe pode nos auxiliar,
e nos possibilita interagir com o mesmo. Alm do FileStream, a podemos verificar na Tabela 3 os seus principais mtodos.

28 Easy .Net Magazine Edio 26


Mtodo Descrio
AppendAllText Adiciona um texto ao final do contedo de um arquivo existente ou no caso do arquivo no existir cria o mesmo inserindo o texto como contedo.
Abre um arquivo, ou cria um novo quando no existir, retornando uma instncia da classe StreamWriter a qual preparada para a escrita de contedo
AppentText
no arquivo.
Copy Cria uma cpia do arquivo.
Create Cria um novo arquivo conforme definies do objeto e retorna uma instncia de FileStream.
CreateText Cria ou abre um arquivo e retorna uma instncia de StreamWriter para a escrita de dados no arquivo.
Move Move um arquivo de um local para outro.
Open Abre um arquivo existente e retorna um objeto FileStream.
OpenRead Abre um arquivo existente e retorna um objeto FileStream como somente leitura.
OpenText Abre um arquivo existente e retorna um objeto StreamReader para leitura de contedo.
OpenWrite Abre um arquivo existente e retorna um objeto StreamWriter para escrita de contedo.
ReadAllBytes Abre o arquivo, grava o contedo em um array de bytes e em seguida fecha o arquivo utilizando uma operao atmica.
ReadAllLines Abre o arquivo, grava o contedo em um array de strings, sendo uma posio por linha de contedo e fecha o arquivo em uma operao atmica.
ReadAllText Abre o arquivo, grava o contedo em uma string e fecha o arquivo em uma operao atmica.
Abre o arquivo, escreve o contedo de um array de bytes no arquivo (sobrescrevendo o contedo atual) e fecha o arquivo em uma operao atmica
WriteAllBytes
(Nota do DevMan 2).
WriteAllLines Abre o arquivo, escreve o contedo de um array de string no arquivo (sobrescrevendo o contedo atual), e fecha o arquivo em uma operao atmica.
WriteAllText Abre o arquivo, escreve o contedo de uma string no arquivo (sobrescrevendo o contedo atual) e fecha o arquivo em uma operao atmica.

Tabela 3. Mtodos da classe File

Mtodo Descrio
CreateDirectory Mtodo que permite a criao de um novo diretrio em um path informado. Nota do DevMan 2
Delete Exclui um diretrio especificado.
Exists Retorna se o diretrio especificado existe no sistema de arquivos. Operaes Atmicas so operaes realizadas com um tratamento
especial, no qual garantida o isolamento de processos concorrentes
GetCreationTime Retorna a data e hora de criao do diretrio especificado. (simultneos), permitindo assim que a operao seja executada
Retorna um objeto DirectoryInfo para o diretrio corrente onde est sendo com uma performance mais eficiente, pois no precisa dividir o
GetCurrentDirectory processamento com outras tarefas. Geralmente so tarefas de
executada a aplicao.
transferncia, leitura ou gravao de dados na totalidade em apenas
GetDirectories Retorna uma lista dos subdiretrios contidos no diretrio especificado. uma operao, no bloqueando por muito tempo o recurso que est
GetDirectoryRoot Retorna o volume ou informao raiz do diretrio especificado. sendo manipulado e, ao mesmo tempo, obtendo exclusividade neste
at o fim da operao.
GetFiles Retorna os nomes dos arquivos no diretrio.
Retorna uma lista contendo subdiretrios e arquivos contidos no diretrio
GetFileSystemEntries
especificado. verificar, a classe File possui muitos mtodos
GetLastAccessTime Retorna a hora do ltimo acesso ao diretrio especificado. j vistos na classe FileInfo, tratada no primeiro
GetLastWriteTime Retorna a hora da ltima gravao no diretrio especificado. artigo sobre IO. Alm disso, muitas das ope-
GetLogicalDrives Retorna uma lista do tipo string com os drives correntes no sistema. raes bsicas, como os mtodos Exists, Delete,
GetParent Retorna o diretrio pai (um nvel acima) do diretrio especificado.
tambm esto disponveis em ambas as classes
e por este motivo no foram relacionados na
Move Move o diretrio especificado para outro local especificado.
Tabela 3.
SetCreationTime Informa a hora de criao para um diretrio.
SetCurrentDirectory Define um diretrio como diretrio corrente de trabalho para a aplicao. Classe Directory
SetLastAccessTime Define a hora do ltimo acesso para um diretrio. A classe Directory muito similar classe File,
SetLastWriteTime Define a hora da ltima gravao para um diretrio. porm possui mtodos estticos para a manipula-
o e criao de diretrios no sistema de arquivos.
Tabela 4. Mtodos da classe Directory.
Na Tabela 4 podemos verificar os principais
mtodos disponibilizados pela classe Directory.
Os mtodos da classe File apresentados na Tabela 3 so todos
static, pois a prpria classe uma classe esttica, sendo assim Enumerador FileAccess
permitida a chamada de qualquer um destes mtodos sem a Alm das classes File e Directory que fornecem apoio no trabalho
necessidade de instanciar um objeto do tipo File. Como podemos com Streams, temos tambm alguns enumeradores, que so tipos

Edio 26 Easy .Net Magazine 29


Primeiros passos com o namespace System.IO Parte 2

de dados com uma lista de opes para serem usadas em deter- de dados. No caso da classe FileStream, ela fornece suporte para a
minados mtodos especficos para a utilizao com as classes de manipulao de arquivos, porm ainda uma classe que fornece
apoio. Um dos enumeradores mais utilizados no trabalho com funcionalidades mais "bsicas" para esta tarefa.
Streams o FileAccess. A classe FileStream uma das classes que derivam (herdam) da
Como o prprio nome deste enumerador j sugere, ele informa classe principal Stream, porm voltada para a manipulao de ar-
uma lista de formas de acesso a um arquivo em mtodos que re- quivos gravados no sistema de arquivos do computador. Podemos
alizam operaes com os mesmos, como no caso do mtodo Open verificar as outras propriedades desta classe na Tabela 7 e os seus
da classe File. Neste mtodo, por exemplo, podemos definir atravs mtodos na Tabela 8 que no foram herdados da classe Stream.
de uma das opes de parmetro, qual tipo de acesso ter esta
"conexo" com o arquivo que est sendo aberto. Esta definio Propriedade Descrio
realizada atravs do enumerador FileAcces. Podemos verificar quais Handle Retorna o identificador do arquivo vinculado ao Stream.
as opes que este enumerador oferece verificando a Tabela 5. Name Retorna o Nome do Arquivo vinculado ao Stream.

Opo Descrio Tabela 7. Propriedades da classe FileStream que no so herdadas da classe Stream
Especifica que o arquivo deve ser aberto com acesso de somente
Read
leitura. Mtodo Descrio
Write Especifica que o arquivo deve ser aberto somente para escrita.
Lock Bloqueia outros processos para no alterar parte ou todo o arquivo.
Especifica o acesso total ao arquivo, permitindo leitura e escrita
Desbloqueia o acesso a outros processos para alterar o arquivo
ReadWrite de informao no mesmo. Equivale ao combinar as opes Read Unlock
vinculado ao Stream.
e Write.
Tabela 8. Mtodos da classe FileStream
Tabela 5. Opes do enumerador FileAccess
As propriedades includas so Handle e Name, as quais tratam
Enumerador FileMode informaes referentes a arquivos contidos no sistema de arquivos
Alm do enumerador FileAccess tambm temos o FileMode que e por isso no poderiam estar presentes na classe base Stream.
outro enumerador muito importante quando estamos trabalhando Os mtodos adicionados so Lock e Unlock, que so mtodos que
com Streams, pois ele quem define como um arquivo ser aberto so aplicados especificamente para arquivos, e por este motivo
ou criado. importante no confundir os enumeradores FileAccess esto na classe FileStream.
e FileMode, pois apesar de parecerem semelhantes eles, tratam duas
opes diferentes na manipulao de Streams, sendo que o primeiro Classes StreamReader
trata a forma que o arquivo ser acessado pelo Stream e o segundo A classe StreamReader a implementao da classe Stream otimi-
trata a forma que o arquivo ser manipulado pelo Stream. Na Tabela 6 zada e restrita apenas leitura de dados, sem preocupar-se com
podemos verificar as opes do enumerador FileMode. outra operao. Ela utilizada a partir de outra classe de Stream,
sendo possvel realizar leituras em arquivos, memria, rede etc.
Opo Descrio Vamos verificar as principais propriedades e mtodos da classe
Abre o arquivo e move o ponteiro do FileStream para o final StreamReader na Tabela 9 e 10 respectivamente.
do arquivo pois estamos informando que vamos adicionar in-
Append
formao no arquivo. Somente pode ser usado em conjunto Propriedade Descrio
com o enumerador FileAccess.Write. Retorna uma instncia da classe Stream correspondente ao
BaseStream
Create Cria um novo arquivo. Caso o arquivo j exista, sobrescrito. Stream vinculado na leitura.
Cria um novo arquivo. Caso o arquivo j exista, disparada CurrentEncoding Retorna a codificao corrente para o Stream vinculado.
CreateNew
uma exceo. Determina quando o leitor encontra o final do Stream
EndOfStream
Abre um arquivo existente. Se o arquivo no existe, dispara- vinculado.
Open
da uma exceo.
Tabela 9. Propriedades da classe StreamReader
Como o nome j sugere, abre um arquivo existente e se este
OpenOrCreate
no existe, cria o mesmo. Mtodo Descrio
Abre um arquivo existente, porm limpa todo o contedo do
Truncate Close Fecha o leitor e o Stream vinculado.
mesmo, ficando com zero bytes de contedo.
Retorna o prximo caractere do Stream vinculado sem
Tabela 6. Opes do enumerador FileMode Peek
mover a posio de leitura do mesmo.
Read L o prximo conjunto de caracteres do Stream vinculado.

Classe FileStream ReadBlock L o prximo bloco de caracteres do Stream vinculado.

Finalmente chegamos primeira classe Stream concreta, ou seja, ReadLine L a prxima linha de caracteres do Stream vinculado.
a primeira classe onde poderemos ver na prtica como utilizar ReadToEnd L todos os caracteres at o final do Stream vinculado.
Streams para a manipulao de dados em arquivos ou outras fontes
Tabela 10. Mtodos da classe StreamReader

30 Easy .Net Magazine Edio 26


Realizando uma leitura de um Arquivo ao usurio. Por este motivo podemos utilizar a classe Stream
este momento j conhecemos as principais classes para rea-
N Reader para trabalhar em conjunto com a classe FileStream a fim
lizarmos a leitura do contedo de um arquivo nos sistemas de de fornecer um retorno dos dados j no formato texto.
arquivos do computador. Uma das formas mais simples de abrir Primeiro, precisamos criar uma instncia da classe StreamReader.
um arquivo para lermos o contedo com a utilizao da classe Ao criar esta instncia, podemos passar o nosso objeto do tipo
de apoio File que vimos anteriormente, pois ela fornece o mtodo FileStream como parmetro para o construtor da classe, assim j
Open, que nos ajuda a criar o vnculo da aplicao com o arquivo estamos vinculados a fonte de leitura para o StreamReader que
que estamos pretendendo ler o contedo. ser o nosso objeto fileStream. Aps criarmos a instncia do
Este mtodo pode receber alguns parmetros, sendo o primeiro tipo StreamReader, basta chamarmos o mtodo ReadToEnd() para
o endereo do arquivo que queremos abrir ( importante lembrar retornarmos todo o contedo do nosso arquivo como texto e
que a operao Open da classe File no est habilitando a leitura apresentarmos ao usurio. Este processo pode ser analisado na
de contedo ainda, mas apenas est "abrindo" o arquivo, ou seja, Listagem 2.
criando uma conexo com o arquivo solicitado).
O segundo parmetro que devemos passar para o mtodo Open Listagem 2. Realizando a leitura do Arquivo
uma opo do enumerador FileMode. Como estamos planejando
01 using System;
apenas a leitura do contedo de arquivo j existente, podemos 02 using System.IO;
passar como parmetro a opo FileMode.Open, a qual est espe- 03 namespace ExemplosStream
04 {
cificando para o mtodo Open que desejamos apenas abrir um
05 class Program
arquivo. 06 {
Por fim, devemos passar o parmetro com uma opo do enu- 07 static void Main(string[] args)
08 {
merador FileAccess para especificarmos qual permisso de acesso
10 FileStream fileStream = File.Open(@C:/teste.txt, FileMode.Open,
e ao que desejamos possuir nesta conexo com o arquivo in- FileAccess.Read);
formado. Como estamos realizando um processo para a leitura 11 StreamReader reader = new StreamReader(fileStream);
12 Console.WriteLine(reader.ReadToEnd());
do contedo de um arquivo existente, devemos passar a opo 13 reader.Close();
FileAccess.Read. 14 fileStream.Close();
O retorno deste mtodo Open um objeto do tipo FileStream, o 15 }
16 }
qual poderemos utilizar adiante para realizar o processo de lei- 18 }
tura. Na Listagem 1 temos o cdigo do nosso exemplo de leitura
at o momento.
Ainda referindo-se ao fechamento dos objetos do tipo Stream,
conforme comentado anteriormente e exemplificado no cdigo da
Listagem 1. Abrindo um arquivo para Leitura
Listagem 2, um fator importante fecharmos os objetos conforme
01 using System.IO; suas dependncias, ou seja, devemos primeiro fechar o objeto
02 namespace ExemplosStream reader e posteriormente fechar o objeto fileStream, caso contrrio,
03 {
teremos uma exceo ao tentar fechar um objeto que est sendo
04 class Program
05 { utilizado por outro objeto ainda aberto.
06 static void Main(string[] args) Nas Listagens 1 e 2 vimos uma das opes de leitura de arqui-
07 {
08 FileStream fileStream = File.Open(@C:/teste.txt, FileMode.Open,
vos utilizando as classes FileStream e StreamReader, porm, como
FileAccess.Read); podemos verificar na Tabela 3 dos mtodos da classe File, temos
09 } o mtodo OpenText, que retorna um objeto do tipo StreamReader,
10 }
11 }
simplificando o cdigo necessrio para a leitura de um arquivo.
Para utilizar este mtodo, precisamos apenas chamar o mtodo
OpenText da classe File, passando como parmetro o endereo
Agora que possu

mos o arquivo aberto (em nosso caso o arqui- do arquivo que desejamos realizar a leitura e armazenar o seu
vo teste.txt, conforme apresentado na Listagem 1), possumos retorno em um objeto do tipo StreamReader. As opes dos enu-
o Stream fileStream conforme a listagem, que nos permitir a meradores FileMode.Open e FileAccess.Read j esto inferidas neste
utilizao do mesmo para a criao de um Stream especfico de mtodo no sendo necessrio especific-las. O cdigo da mesma
leitura de dados de arquivos, que o StreamReader. leitura realizada nas Listagens 1 e 2, porm, com a utilizao da
O objeto do tipo FileStream simplesmente um Stream bsico e leitura otimizada com o mtodo OpenText pode ser verificado na
podemos utiliz-lo para ler os dados do nosso arquivo utilizando Listagem 3.
os mtodos Read ou ReadByte, porm, estes mtodos retornam Por fim, ainda temos uma forma mais otimizada de realizar a
informaes dos dados em bytes, ento precisaramos ainda con- leitura de todo o contedo do arquivo, que pode ser realizada
verter os dados para texto para que pudessem ser apresentados atravs do mtodo ReadAllText da classe File apenas passando como

Edio 26 Easy .Net Magazine 31


Primeiros passos com o namespace System.IO Parte 2

parmetro o endereo do arquivo a ser lido. A Listagem 4 apresenta Propriedade Descrio


o exemplo da utilizao do mtodo ReadAllText da classe File. Definio para o objeto StreamWriter se o mesmo automa-
ticamente atualiza o Stream base ou necessita de chamar o
AutoFlush
mtodo Flush para gravar os dados alterados ou includos no
Listagem 3. Realizando a leitura do Arquivo com o mtodo OpenText Stream base.
Retorna uma instncia da classe Stream correspondente ao
01 using System;
BaseStream
Stream vinculado na gravao.
02 using System.IO;
Retorna a codificao corrente para o Stream vinculado na
03 namespace ExemplosStream Encoding
04 { gravao.
05 class Program Determina se a string passada contm um indicador de final
06 { NewLine de linha (enter). Usado normalmente se necessrio alterar uma
07 static void Main(string[] args) string que termina em uma linha individual.
08 {
09 StreamReader reader = File.OpenText(@C:\teste.txt); Tabela 11. Propriedades da classe StreamWriter
10 Console.WriteLine(reader.ReadToEnd());
11 reader.Close(); Mtodo Descrio
12 Console.ReadKey();
Close Fecha o StreamWriter e o Stream vinculado.
13 }
14 } Write Escreve os dados no Stream.
15 }
Escreve os dados no Stream terminando com uma quebra de
Listagem 4. Realizando a leitura do Arquivo com o mtodo ReadAllText linha, ou seja, o prximo contedo escrito iniciar em nova
WriteLine
linha. (similar ao WriteLine da classe Console utilizada para
01 using System; apresentar informaes no Prompt).
02 using System.IO;
03 namespace ExemplosStream Tabela 12. Mtodos da classe StreamWriter
04 {
05 class Program
06 { Listagem 5. Realizando leitura do Arquivo com verificao
07 static void Main(string[] args)
08 { 01 using System;
09 Console.WriteLine(File.ReadAllText(@C:/teste.txt)); 02 using System.IO;
10 Console.ReadKey(); 03 namespace ExemplosStream
11 }
04 {
12 }
05 class Program
13 }
06 {
07 static void Main(string[] args)
08 {
Como podemos verificar na Listagem 4, a leitura de todo o con- 09 StreamReader reader = File.OpenText(@C:\teste.txt);
tedo de um arquivo torna-se muito mais simples com o mtodo 10 while (!reader.EndOfStream)
ReadAllText. Mas porque precisamos das outras formas de leitura 11 {
12 string linha = reader.ReadLine();
vistas anteriormente? Simples: para quando precisamos realizar
13 if (linha.Contains(teste))
a leitura de apenas parte do contedo, como podemos ver um 14 Console.WriteLine(linha);
exemplo na Listagem 5, onde estamos verificando cada linha 15 }
do arquivo lido e apenas apresentando as linhas que possuam a 16 reader.Close();
palavra teste, por exemplo. 17 Console.ReadKey();
18 }
19 }
Classe StreamWriter 20 }
Obviamente em uma aplicao no iremos apenas utilizar a
Listagem 6. Abrindo um arquivo existente para Gravao
leitura de dados de arquivos, mas com certeza tambm preci-
saremos gravar dados em arquivos ou criar novos arquivos com 01 using System;
dados. Para esta funcionalidade dispomos da classe StreamWriter 02 using System.IO;
que a classe especializada para a escrita de contedo. Ela 03 namespace ExemplosStream
trabalha muito similarmente classe StreamReader, tratando-se 04 {
05 class Program
da relao com a classe FileStream e a classe File. Primeiramente 06 {
vamos verificar as principais propriedades e mtodos desta 07 static void Main(string[] args)
classe nas Tabelas 11 e 12 respectivamente. 08 {
Utilizando uma sequncia lgica similar utilizada nos exem- FileStream fileStream = File.Open(@C:\teste.txt, FileMode.Open,
FileAccess.Write);
plos da classe StreamReader, vamos iniciar nosso exemplo da classe
09 }
StreamWriter. Inicialmente vamos precisar abrir a conexo com 10 }
um arquivo. Caso o nosso arquivo j exista, devemos chamar o 11 }

32 Easy .Net Magazine Edio 26


mtodo Open da classe File, similarmente como fizemos para a Continuando nosso exemplo de gravao de dados, agora utili-
leitura, passando o endereo do arquivo, uma opo do enume- zaremos a classe StreamWriter para realizar a gravao de dados
rador FileMode e uma opo do enumerador FileAccess, porm no contedo do nosso arquivo teste.txt. A forma de instanciar
este dever ter uma opo diferente da utilizada na leitura, pois o objeto do tipo StreamWriter idntica a forma utilizada para
na leitura precisvamos apenas de permisses de acesso para o objeto StreamReader anteriormente, passando o objeto do tipo
ler os dados e na gravao precisamos de permisso para gravar FileStream como parmetro para realizar o vnculo entre os ob-
dados, sendo assim, devemos passar como ltimo parmetro o jetos. Aps o vnculo realizado, basta chamar o mtodo Write do
enumerador FileAccess.Write. A nossa linha de cdigo dever ficar objeto StreamWriter passando o texto a ser gravado no arquivo,
conforme apresentada na Listagem 6. lembrando que se estiver gravando em um arquivo j existente,
Antes de iniciarmos o exemplo de gravao, temos que ter em este texto ser adicionado ao incio do contedo j existente,
mente que muitas vezes o arquivo que estamos necessitando sobrescrevendo o contedo atual, a menos que seja utilizado o
gravar ainda no existe, sendo um arquivo novo a ser criado e, enumerado FileMode.Append na criao do objeto FileStream, no
portanto, a forma apresentada na Listagem 6 no atender a esta mtodo Open() da classe File, fazendo com que o cursor do Stream
necessidade, pois no encontrar nenhum arquivo teste.txt e seja posicionado no final do contedo existente. Assim o novo
retornar uma exceo de arquivo no encontrado. Para resolver contedo ser adicionado ao final.
esta questo temos duas opes. Na Listagem 9 temos o cdigo do exemplo de gravao de dados
A primeira opo utilizarmos o mtodo Create() da classe File, em arquivos com a classe StreamWriter.
no lugar do mtodo Open(). Este mtodo dispensa os parmetros
enumerados FileMode e FileAccess, conforme apresentado na Listagem 9. Gravando dados no arquivo.
Listagem 7.
01 using System;
A segunda opo que temos continuar utilizando o mtodo 02 using System.IO;
Open() da classe File e alterar apenas o enumerador FileMode para 03 namespace ExemplosStream
04 {
a opo FileMode.OpenOrCreate, sendo esta opo a mais reco-
05 class Program
mendada (dependendo do objetivo), pois caso o arquivo exista, 06 {
o mesmo ser aberto, e caso no exista ele ser criado. O cdigo 07 static void Main(string[] args)
08 {
desta segunda opo pode ser verificado na Listagem 8.
09 FileStream fileStream = File.Open(@C:\teste.txt,
FileMode.OpenOrCreate, FileAccess.Write);
10 StreamWriter writer = new StreamWriter(fileStream);
Listagem 7. Criando um arquivo para Gravao 11 writer.Write(Novo texto);
12 writer.Close();
01 using System; 13 fileStream.Close();
02 using System.IO; 14 }
03 namespace ExemplosStream 15 }
04 { 16 }
05 class Program
06 {
07 static void Main(string[] args) Assim como realizamos com a classe StreamReader, simplificando
08 { o cdigo para no precisar criar um objeto FileStream, tambm
FileStream fileStream = File.Create(@C:\teste.txt);
podemos fazer o mesmo com o objeto StreamWriter. Para isto,
09 }
10 } podemos utilizar o mtodo CreateText, porm, neste caso, este
11 } poder ser utilizado apenas para criar um novo arquivo (muitas
vezes mais simples criar um novo arquivo e copiar o contedo
Listagem 8. Abrindo ou criando um arquivo para gravao
do j existente adicionando o novo contedo, do que atualizar o
01 using System; arquivo existente, mas isto cabe uma avaliao de cada cenrio).
02 using System.IO; O cdigo simplificado do nosso exemplo da Listagem 9 (porm
03 namespace ExemplosStream
para um novo arquivo), fica conforme a Listagem 10.
04 {
05 class Program Novamente, seguindo a mesma linha de raciocnio utilizada nos
06 { exemplos da classe StreamReader, vamos otimizar novamente a
07 static void Main(string[] args) nossa gravao de dados em arquivos. Para isto, podemos utilizar
08 { o mtodo WriteAllText da classe File. Este mtodo permite realizar
FileStream fileStream = File.Open(@C:\teste.txt,
a criao de arquivos passando o texto do contedo como parme-
FileMode.OpenOrCreate, FileAccess.Write);
09 } tro, tudo em apenas uma linha de cdigo, portanto sendo muito
10 } mais prtico ao desenvolvedor. O cdigo para o nosso exemplo
11 } da Listagem 10 utilizando o mtodo WriteAllText fica conforme
a Listagem 11.

Edio 26 Easy .Net Magazine 33


Primeiros passos com o namespace System.IO Parte 2

Listagem 10. Gravando dados em um novo Arquivo - Otimizado Alm das classes StringReader e StringWriter, o .NET framework
tambm possui duas classes para os casos em que estamos tra-
01 using System;
02 using System.IO;
balhando com dados binrios e no formatados como texto. So
03 namespace ExemplosStream as classes BinaryReader e BinaryWriter. O funcionamento destas
04 { classes, que tambm so considerados leitoras e escritoras, respec-
05 class Program
06 {
tivamente, idntico ao funcionamento das classes StreamReader
07 static void Main(string[] args) e StreamWriter, com a diferena que estas tratam o contedo dos
08 { arquivos em formato binrio e no em texto.
09 StreamWriter writer = File.CreateText(@C:\testenovo.txt);
10 writer.Write(Texto do novo arquivo.);
11 writer.Close(); Listagem 12. Gravando e lendo textos em memria
12 }
13 } 01 using System;
14 } 02 using System.IO;
03 namespace ExemplosStream
Listagem 11. Gravando dados em um novo Arquivo com o mtodo WriteAllText 04 {
05 class Program
01 using System; 06 {
02 using System.IO; 07 static void Main(string[] args)
03 namespace ExemplosStream 08 {
04 { 09 //Escrevendo dados
05 class Program 10 StringWriter writer = new StringWriter();
06 { 11 writer.WriteLine(Primeira Linha);
07 static void Main(string[] args) 12 writer.WriteLine(Segunda Linha);
08 { 13 writer.WriteLine(Linha final);
09 File.WriteAllText(@C:\testenovo.txt, Texto do novo arquivo); 14 Console.WriteLine(writer.ToString());
10 } 15 Console.ReadKey();
11 } 16 //Lendo dados
12 } 17 string texto = @Exemplo de varivel
18 alocada em memria
19 do tipo multilinha ou texto;
Leitores e escritores adicionais 20
21
StringReader reader = new StringReader(texto);
while (reader.Peek() != -1)
As classes StreamReader e StreamWriter so consideradas Leitores 22 {
e Escritores, respectivamente. Elas derivam das classes abstratas 23 string linha = reader.ReadLine();
24 Console.WriteLine(linha);
TextReader e TextWriter e so especficas para a leitura e gravao 25 }
de textos em arquivos. 26 Console.ReadKey();
Alm destas classes vistas anteriormente, temos tambm as 27 }
28 }
classes StringReader e StringWriter que praticamente possuem 29 }
o mesmo funcionamento das classes StreamReader e StreamWri-
ter, com a diferena que estas so especficas para leitura e
escrita de textos na memria, sem a necessidade de utilizao Podemos verificar o exemplo de implementao destas classes na
de Streams. Listagem 13, onde inicialmente criamos um arquivo de contedo
Os mtodos disponveis para as classes StringReader e String binrio (extenso .bin) utilizando a classe BinaryWriter e gravamos
Writer so basicamente os mesmos das classes StreamReader e trs tipos de informao, sendo um nmero, um conjunto de bytes
StreamWriter, j que herdam da mesma classe base. Para fins de e um texto e, posteriormente utilizamos a classe BinaryReader para
exemplificao, na Listagem 12 temos um exemplo de leitura e ler os dados gravados neste arquivo.
gravao de texto na memria com a utilizao das classes String Como podemos verificar na Listagem 13, entre as linhas 9 e 19
Reader e StringWriter. estamos realizando a criao de um arquivo binrio, onde gra-
Na Listagem 12 inicialmente estamos criando um escritor do vamos trs informaes diferentes em sequncia.
tipo StringWriter (linha 10) e escrevendo dados, sendo esta forma Entre as linhas 20 e 36 da Listagem 13 estamos realizando a
mais performtica do que alterarmos uma varivel a cada novo leitura do arquivo binrio previamente gravado importante
texto adicionado ela. Na linha 14 estamos apresentando o texto notarmos que existem mtodos de leitura (Read) especficos para
completo aps a escrita. cada tipo de dado contido no arquivo e tambm que importante
Na linha 17 estamos criando uma varivel com mais de uma sabermos a sequncia de gravao destes dados para estruturar-
linha para que seja lida com o objeto do tipo StringReader ins- mos a leitura de mesma forma. Nas linhas 23 a 25 estamos reali-
tanciado na linha 20. Na linha 21 estamos realizando um loop zando a leitura das informaes na mesma sequncia que foram
enquanto exista caractere para ser lido (o mtodo Peek() verifica gravadas e respeitando os mesmos tipos de dados gravados em
o valor do prximo caractere sem ler o mesmo) e apresentando cada sequncia. Por fim, entre as linhas 28 e 36 estamos apresen-
cada linha no prompt. tando as informaes recuperadas do arquivo para o usurio.

34 Easy .Net Magazine Edio 26


Listagem 13. Gravando e lendo arquivos binrios determina a capacidade do Stream na memria do computador.
Como o recurso de memria um recurso limitado no hardware,
01 using System;
02 using System.IO; importante esta propriedade sempre estar definida com a melhor
03 namespace ExemplosStream preciso possvel, assim, evitamos o uso de mais memria do que
04 { realmente iremos precisar. Caso no seja informada a capacidade
05 class Program
06 { do MemoryStream, ele ser criado inicialmente com 4096 bytes e
07 static void Main(string[] args) ser expandido conforme necessrio.
08 {
Com exceo destas particularidades, o MemoryStream trabalha
09 //Gravando Arquivo Binrio.
10 FileStream fileStream = File.Create(@C:\ArquivoBinario.bin); de forma muito parecida com o FileStream e isto pode ser verificado
11 BinaryWriter writer = new BinaryWriter(fileStream); com mais clareza analisando o cdigo de exemplo da Listagem 14,
12 long numero = 250;
13 byte[] bytes = new byte[]{10, 20, 50, 100};
onde estamos criando um MemoryStream, um StreamWriter vin-
14 string s = texto; culado a este MemoryStream para permitir a gravao de texto,
15 writer.Write(numero); e ento gravamos um texto na memria e, por fim, estamos
16 writer.Write(bytes);
17 writer.Write(s);
gravando os dados da memria em um arquivo fsico utilizando
18 writer.Close(); um FileStream.
19 fileStream.Close();
20 //Lendo Arquivo Binrio
21 FileStream fileStream2 = File.Open(@C:\ArquivoBinario.bin, Listagem 14. Gravando um Arquivo Utilizando o MemoryStream
FileMode.Open, FileAccess.Read);
22 BinaryReader reader = new BinaryReader(fileStream2); 01 using System;
23 long numero2 = reader.ReadInt64(); 02 using System.IO;
24 byte[] bytes2 = reader.ReadBytes(4); 03 namespace ExemplosStream
25 string s2 = reader.ReadString(); 04 {
26 reader.Close(); 05 class Program
27 fileStream2.Close(); 06 {
28 Console.WriteLine(numero2); 07 static void Main(string[] args)
29 Console.WriteLine(); 08 {
30 foreach (byte b in bytes2) 09 MemoryStream memoryStream = new MemoryStream();
31 { 10 StreamWriter writer = new StreamWriter(memoryStream);
32 Console.WriteLine([{0}], b); 11 writer.WriteLine(Escrevendo dados em memoria.);
33 } 12 writer.WriteLine(Estes dados serao gravados em um arquivo.);
34 Console.WriteLine(); 13 writer.Flush();
35 Console.WriteLine(s2); 14 FileStream fileStream = File.Create(@C:\DadosMemoria.txt);
36 Console.ReadKey(); 15 memoryStream.WriteTo(fileStream);
37 } 16 writer.Close();
38 } 17 fileStream.Close();
39 } 18 memoryStream.Close();
19 }
20 }
21 }
Classe MemoryStream
Em alguns casos, dependendo do que precisamos implementar
em nossas aplicaes, existe a necessidade de criarmos alguns Analisando a Listagem 14, inicialmente criamos um Memory
arquivos temporrios armazenados somente na memria do Stream (linha 09) sem informar a capacidade, pois no sabemos
computador, ou seja, arquivos que no precisaro ser gravados em quanto precisamos. Em seguida, entre as linhas 10 e 13 estamos
nenhum local fsico, porm, precisamos deles para um processo criando um StreamWriter e escrevendo dados no MemoryStream
posterior na mesma aplicao. A aplicao de MemoryStreams criado (perceba que usamos o mtodo Flush() para forar a gra-
pode reduzir a necessidade de arquivos e de buffers temporrios vao dos dados no MemoryStream). Logo aps, nas linhas 14 e 15
na aplicao. estamos criando um FileStream para um novo arquivo chamado
DadosMemoria.txt e gravamos o contedo do MemoryStream para
Mtodo Descrio o FileStream utilizando o mtodo WriteTo(). Para finalizar, entre as
GetBuffer Retorna o array de bytes que usado para a criao do Stream. linhas 16 e 18 estamos fechando os Streams abertos.
ToArray Escreve os dados do Stream em um array de bytes.
WriteTo Grava o MemoryStream em outro Stream.
Classe BufferedStream
Em algumas situaes em que estamos trabalhando com a gra-
Tabela 13. Mtodos da classe MemoryStream vao de arquivos, a performance de gravarmos diretamente no
arquivo pode no ser a melhor e, quando estamos trabalhando
Esta classe herda as propriedades e mtodos da classe Stream, com arquivos muito grandes, corremos o risco de ter algum erro
apenas com a adio de uma propriedade e trs mtodos novos, durante a gravao em determinado ponto, onde perderamos
conforme a Tabela 13. A propriedade adicional a Capacity, que todo o contedo j gravado. Nestas situaes, o .NET fornece uma

Edio 26 Easy .Net Magazine 35


Primeiros passos com o namespace System.IO Parte 2

classe chamada BufferedStream que tem por objetivo criar uma ca- Concluso
mada intermediria entre o Stream do arquivo fsico e o Stream de Fechando este segundo artigo da srie sobre tratamento de
gravao. Ela trabalha de maneira muito similar ao MemoryStream, arquivos e diretrios com .NET utilizando o System.IO, verifi-
pois gravamos os dados diretamente no BufferedStream e quando camos como trabalhar com a criao de arquivos, assim como a
concluirmos todo o processo realizamos a gravao de uma vez de atualizao e leitura de dados dos mesmos. Tambm verificamos
todo o contedo tratado. Isto ocorre quando o Stream de gravao como podemos utilizar a memria do computador para nos apoiar
realiza o mtodo Flush() (geralmente executado automaticamente na manipulao de dados, sejam estes textos, binrios etc. Vimos
quando chamamos o mtodo Close()). como gravar arquivos utilizando buffers e as vrias formas de
As propriedades e mtodos da classe BufferedStream so as mes- utilizao dos principais Streams disponibilizados pelo .NET.
mas da classe Stream, pois um Stream genrico, que serve apenas Os Streams analisados neste artigo so apenas os mais utiliza-
para transposio de dados entre Stream especializados. dos, existindo ainda outros tipos, como por exemplo, os Streams
O exemplo de utilizao do BufferedStream pode ser verificado na de compresso e os streams de rede, que podem ser um prximo
Listagem 15, onde estamos criando um FileStream para o arquivo passo de estudo do leitor para o aprofundamento do tema.
ArquivoBuffer.txt e um BufferedStream apontando para este File Com esta srie de artigos, acredito que o leitor conseguir por
Stream. Posteriormente criamos um StreamWriter para escrever em prtica em suas aplicaes a manipulao de dados gravados
os dados no BufferedStream e ao fecharmos o StreamWriter os da- em arquivos fsicos de uma forma eficiente. Os cdigos de exem-
dos so automaticamente gravados no FileStream para o arquivo plo apresentados neste artigo sero disponibilizados no site da
ArquivoBuffer.txt. Devmedia para download.

Listagem 15. Gravando um Arquivo Utilizando o BufferedStream


Fabio Rosa
01 using System; fabiorosa.net@gmail.com
02 using System.IO; Analista Programador h 4 anos, da equipe de desenvolvimento da
03 namespace ExemplosStream empresa Lgica Informtica. Domnio em UML, SQL Server, WPF,
04 {
Silverlight, Windows Forms e GeneXus. Cursando Anlise e Desenvolvimento
05 class Program
06 { de Sistemas pela UNOPAR.
07 static void Main(string[] args)
08 {
09 FileStream fileStream = File.Create(@C:\ArquivoBuffered.txt); .NET Framework System.IO
10 BufferedStream bufferedStream = new BufferedStream(fileStream);
11 StreamWriter writer = new StreamWriter(bufferedStream);
http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=EN-
12 writer.WriteLine(Gravando dados no arquivo.); US&k=k(SYSTEM.IO);k(TargetFrameworkMoniker-%22.NETFRAMEWORK%
13 writer.Close(); 2cVERSION%3dV4.0%22);k(DevLang-CSHARP)&rd=true
14 bufferedStream.Close();
15 fileStream.Close();
16 } Primeiros passos com o namespace System.IO Easy.Net Magazine 25
17 } http://www.devmedia .com.br/primeiros-passos-com-o-namespace-system-io-
18 }
revista-easy-net-magazine-25/25673

36 Easy .Net Magazine Edio 26


Edio 26 Easy .Net Magazine 37