Escolar Documentos
Profissional Documentos
Cultura Documentos
Apostila CSharp
Apostila CSharp
Conceitos Básicos
Cornélio Procópio
20 de novembro de 2008
Apostila baseada nas obras de : Fabio R. Galuppo, Edwin Lima, Breno Gontijo e Rudson Kiyoshi
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
2
Sumário
1 INTRODUÇÃO 9
1.1 Plataforma .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.1.1 Abordagem .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.1.2 Arquitetura .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.1.2.1 CLR (Commom Language Runtime) . . . . . . . . . . . . . . . . 10
1.1.2.2 CLS (Common Language Specification) . . . . . . . . . . . . . . 10
1.1.2.3 BCL (Base Classe Library) . . . . . . . . . . . . . . . . . . . . . 10
2 A linguagem C# 10
2.1 Caracterı́sticas do C# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3 PRIMEIRO PROGRAMA 12
3.1 Main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
4 ESTRUTURA DE UM PROGRAMA 12
5 VARIÁVEIS NA LINGUAGEM C# 13
5.1 Tipos de dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
5.1.1 Tipos Valor e Tipos Referência . . . . . . . . . . . . . . . . . . . . . . . . 15
5.1.2 Conversão de Tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
5.1.3 O Objeto Convert . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
5.2 Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
6 COMANDOS 18
6.1 Seleção . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
6.1.1 Comando if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
6.1.2 Comando switch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
6.2 Iteração ou Loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
6.2.1 Comando for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
6.2.2 Comando foreach . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
6.2.3 Comandos do e while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
3
7 OPERADORES 26
7.1 Operadores Aritméticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
7.2 Operadores de Incremento e Decremento . . . . . . . . . . . . . . . . . . . . . . . 29
7.3 Operadores Lógico, Relacional e Condicional . . . . . . . . . . . . . . . . . . . . 30
7.4 Operação de Atribuição . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
10 MANIPULAÇÃO DE ARQUIVOS 46
10.1 Classes DirectoryInfo e FileInfo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
10.1.1 Criando diretórios e subdiretórios . . . . . . . . . . . . . . . . . . . . . . . 47
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
4
Lista de Tabelas
1 Tipos primitivos do C# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2 Tipos de conversão automática . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3 Operadores do C# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
4 Classes de excessões mais comuns em C# . . . . . . . . . . . . . . . . . . . . . . 42
5 Principais classes do System.IO . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
6 Propriedades e métodos de DirectoryInfo e FileInfo . . . . . . . . . . . . . . . . . 47
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
6
Lista de Códigos
1 Hello World em C# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2 Estrutura de um programa em C# . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3 Exemplo de conversão automática de tipos . . . . . . . . . . . . . . . . . . . . . . 15
4 Exemplo de utilização do objeto Convert . . . . . . . . . . . . . . . . . . . . . . 16
5 Sintaxe para a declaração de Arrays . . . . . . . . . . . . . . . . . . . . . . . . . 17
6 Sintaxe para a declaração de Arrays com duas ou mais dimensões . . . . . . . . . 17
7 Sintaxe para a declaração de uma matriz de Arrays com duas ou mais dimensões 17
8 Sintaxe para a inicialização de Arrays com duas ou mais dimensões . . . . . . . . 17
9 Passando Arrays à métodos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
10 Exemplo do comando if em C# . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
11 Ifs com And e Or . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
12 Ifs aninhados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
13 Curto-circuito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
14 Exemplo if-else-if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
15 Operador Ternário . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
16 Comando switch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
17 Comando switch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
18 Iteração for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
19 Iteração for (exemplo) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
20 Iteração foreach (exemplo) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
21 Iteração do while (exemplo) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
22 Operadores Unários . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
23 Operadores Binários . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
24 Exemplo Operadores Binários . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
25 Operadores de Incremento e Decremento . . . . . . . . . . . . . . . . . . . . . . . 29
26 Exemplo do operador de negação . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
27 Exemplo do operador de atribuição . . . . . . . . . . . . . . . . . . . . . . . . . . 30
28 Exemplo do operador de atribuição composta . . . . . . . . . . . . . . . . . . . . 31
29 Exemplo de codificação sem qualquer padrão de nomenclatura . . . . . . . . . . . 31
30 Exemplo de codificação com padrão de nomenclatura . . . . . . . . . . . . . . . . 31
31 Exemplo de Classe em C# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
7
32 Exemplo de Propriedades em C# . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
33 Exemplo de utilização dos modificadores de visibilidade C# . . . . . . . . . . . . 34
34 Exemplo de declaração de herança em C# . . . . . . . . . . . . . . . . . . . . . . 35
35 Exemplo de this e base em C# . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
36 Exemplo instanciação de objeto em C# . . . . . . . . . . . . . . . . . . . . . . . 36
37 Exemplo acesso a atributos e métodos em C# . . . . . . . . . . . . . . . . . . . . 36
38 Exemplo acesso a atributos e métodos estáticos em C# . . . . . . . . . . . . . . 37
39 Exemplo de implementação de uma classe abstrata em C# . . . . . . . . . . . . 38
40 Exemplo de implementação de uma interface em C# . . . . . . . . . . . . . . . . 38
41 Exemplo de implementação de uma classe sealed em C# . . . . . . . . . . . . . . 40
42 Exemplo de utilização do comando throw . . . . . . . . . . . . . . . . . . . . . . 42
43 Exemplo de utilização do bloco try - catch . . . . . . . . . . . . . . . . . . . . . . 43
44 Exemplo de utilização do bloco try - finally . . . . . . . . . . . . . . . . . . . . . 44
45 Exemplo de utilização do bloco try - catch - finally . . . . . . . . . . . . . . . . . 44
46 Membros da classe Exception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
47 Criação de diretório . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
48 Criação de subdiretórios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
49 Propriedades de um diretório . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
50 Propriedades de arquivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
51 Criando arquivos com a classe FileInfo . . . . . . . . . . . . . . . . . . . . . . . . 49
52 Abrindo arquivos com a classe FileInfo . . . . . . . . . . . . . . . . . . . . . . . . 49
53 Escrevendo/Lendo com FileStream . . . . . . . . . . . . . . . . . . . . . . . . . . 49
54 CreateText e OpenText . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
55 Janela filha (MDI) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
56 Fechar janela filha (MDI) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
57 Código para exibir formulário . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
58 Código para exibir formulário com show dialog . . . . . . . . . . . . . . . . . . . 53
59 Variável pública do tipo string . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
60 Modificando o valor da string . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
61 Modificando o valor da label para um string local . . . . . . . . . . . . . . . . . . 54
62 Padrão para Connection Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
63 Padrão para Connection Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
64 Exemplo de utilização do comando SqlCommand . . . . . . . . . . . . . . . . . . 60
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
8
1 INTRODUÇÃO
.NET é a nova plataforma de desenvolvimento da Microsoft que tem como foco principal o
desenvolvimento de Serviços WEB XML. Um serviço Web XML, ou simplesmente Web Service
transcende ao que nós conhecemos como páginas dinâmicas, as quais podem ser acessadas a
partir de um browser. A idéia central de um Web Service consiste em permitir que as aplicações,
sejam elas da Web ou Desktop, se comuniquem e troquem dados de forma simples e transparente,
independente do sistema operacional ou da linguagem de programação.
Apostila C# 9
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
10
1.1.2.3 BCL (Base Classe Library ) Oferece ao desenvolvedor uma biblioteca consistente
de componentes de software reutilizáveis que não apenas facilitem, mas também que acelerem o
desenvolvimento de sistemas.
2 A linguagem C#
2.1 Caracterı́sticas do C#
Apostila C# 10
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
11
• Completamente orientada a objetos: em C#, qualquer variável tem de fazer parte de uma
classe.
• Fortemente tipada: isso ajudará a evitar erros por manipulação imprópria de tipos, atri-
buições incorretas etc.
• Gera código gerenciado: assim como o ambiente .NET é gerenciado, assim também é a
linguagem C#.
• Controle de versões: cada assembly gerado, seja como EXE ou DLL, tem informação
sobre a versão do código, permitindo a coexistência de dois assemblies homônimos, mas
de versões diferentes no mesmo ambiente.
• Suporte a código legado: o C# pode interagir com código legado de objetos COM e DLLs
escritas em uma linguagem não-gerenciada.
Apostila C# 11
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
12
3 PRIMEIRO PROGRAMA
5 }
6 }
A cláusula using referencia a as classes a serem utilizadas, System atua como namespace
das classes. O namespace System contém muitas classes, uma delas é a Console. O método
WriteLine, simplesmente emite a string no console.
3.1 Main
O método Main é o ponto de entrada de execução do seu programa. A classe que será
executada inicialmente possui embutida a função estática Main. Uma ou mais classes podem
conter a função Main, entretanto, apenas uma será o ponto de entrada, indicada na compilação
pelo parâmetro /main:<tipo>, ou simplificando /m:<tipo>.
O método Main, pode ser declarado de 4 formas:
4 ESTRUTURA DE UM PROGRAMA
O esqueleto de um programa em C#, apresentando alguns dos seus elementos mais comuns,
segue abaixo:
Apostila C# 12
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
13
5 VARIÁVEIS NA LINGUAGEM C#
• Static: existe apenas uma única copia desta variável para todas as instâncias de uma
classe. Uma variável static começa a existir quando um programa começa a executar, e
deixa de existir quando o programa terminar.
• Instance: existe uma copia para cada instância de uma classe. Uma variável Instance
começa a existir quando uma instância daquele tipo e criado, e deixa de existir quando
não houver nenhuma referencia aquela instância ou quando e método Finalize e executado.
Apostila C# 13
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
14
Como toda linguagem de programação o C# também apresenta seu grupo de tipos de dados
básico. Esses tipos são conhecidos como tipos primitivos ou fundamentais por serem suportados
diretamente pelo compilador, e serão utilizados durante a codificação na definição de variáveis,
parâmetros, declarações e até mesmo em comparações.
A Tabela 1 apresenta os tipos básicos da linguagem C# relacionados juntamente com os
tipos de dados do .NET Em C#, todos eles possuem um correspondente na Common Language
Runtime(CLR), por exemplo int, em C#, refere-se a System.Int32.
Apostila C# 14
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
15
Tipos valor armazenam dados em memória enquanto tipos referência armazenam uma re-
ferência, ou o endereço, para o valor atual.
Quando utilizamos uma variável do tipo referência não estaremos acessando seu valor dire-
tamente, mas sim um endereço referente ao seu valor, ao contrário do tipo valor que permite o
acesso diretamente a seu conteúdo.
Os tipos ponteiro, apenas apontam para um endereço de memória.
• Como existem diversos tipos de números, inteiros, ponto flutuante ou decimal, os valores
são convertidos sempre para o tipo de maior faixa de valores. Por exemplo, o tipo long é
convertido para o ponto flutuante, mais é importante ressaltar que o contrario causa um
erro.
• Os tipos de menor faixa são convertidos para os de maior faixa. Por exemplo, o tipo int
pode ser convertido para: long, float, double ou decimal.
• A conversão dos tipos de ponto flutuante(float, double) para decimal causa erro.
• A conversão entre os tipos com sinal e sem sinal de valores inteiros com o mesmo tamanho
causa erro. Por exemplo, entre o tipo int e unit.
Por exemplo:
Apostila C# 15
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
16
Em C# temos o objeto Convert que é usado para converter um tipo de dado em outro.
Os tipos de dados suportados são: Boolean, Char, SByte, Byte, Int16, Int32, Int64, UInt16,
UInt32, UInt64, Single, Double, Decimal, DateTime e String.
Por exemplo:
Apostila C# 16
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
17
5.2 Arrays
Um tipo array é uma matriz de valores do mesmo tipo, que é criada em tempo de execução,
podendo ser acessada por meio de um ı́ndice.
A declaração do array sempre faz o uso de um colchete( [ ] ) depois do tipo da variável. O
uso da instrução new sempre deve ser utilizado, pois é obrigatório.
O tipo array pode ter diversas dimensões, o tamanho desta é definido pelo desenvolvedor,
mas devemos saber que o primeiro ı́ndice é sempre zero.
No tipo array devemos sempre inicializar seus elementos, pois é obrigatório também. Veja
abaixo a forma de sintaxe para a declaração de arrays.
Código 7: Sintaxe para a declaração de uma matriz de Arrays com duas ou mais dimensões
1 < TIPO > [][] NomeDoArray = new < TIPO > [ tamanho do array ] [ tamanho do array ];
2
Apostila C# 17
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
18
5 string [ ,] ElementoVetor = new string [3 ,3] {{ " ab " , " ac " , " bc "} ,
6 {" ab " , " ac " , " bc " }};
7
Para passar um argumento array para um método, especifique o nome do array sem usar
colchetes e para que um método receba um array, a lista de parâmetros deve especificar que um
array será recebido.
Veja o seguinte exemplo:
6 COMANDOS
6.1 Seleção
Os comandos de seleção são utilizados na escolha de uma possibilidade entre uma ou mais
possı́veis. Os comandos if e switch fazem parte deste grupo.
Apostila C# 18
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
19
6.1.1 Comando if
5 }
6 // if com uma única possibilidade . Exibe a string " Verdadeiro " no Console caso a
7 // express~
a o ( a == true ) seja verdadeira , sen~
a o exibe a string " Falso "
8 if ( a == true ) {
9 System . Console . Write ( " V e r d a d e i r o " );
10 }
11 else {
12 System . Console . Write ( " F a l s o " );
13 }
Toda expressão do comando if deve ser embutida em parênteses (()) e possui o conceito de
curto-circuito (short-circuit). Isto quer dizer que se uma expressão composta por And (&&),
fornecer na sua primeira análise um valor booleano false (falso), as restantes não serão analisadas.
Este conceito é válido para todas expressões booleanas.
Por exemplo:
4 // || ( Or ) . Ambas funç~
o es s~
a o executadas
5 if ( MyFunc () || MyFunc2 () ) ;
6
Apostila C# 19
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
20
Assim como outros comandos. O if também pode ser encontrado na forma aninhada.
5 }
6 }
7 }
O comando if também pode ser encontrado num formato escada if-else-if , quando
existem mais do que duas possibilidades. Porém, na maioria destes casos, se as expressões não
forem compostas ou utilizarem de funções, a cláusula switch substitui este tipo de construção.
Apostila C# 20
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
21
17 // InsertFunction () ;
18 }
19 else if ( chOpt == ’ 2 ’ ) {
20 Console . WriteLine ( " A t u a l i z a r . . . " );
21 // UpdateFunction () ;
22 }
23 else if ( chOpt == ’ 3 ’ ) {
24 Console . WriteLine ( " A p a g a r . . . " );
25 // DeleteFunction () ;
26 }
27 else {
28 Console . WriteLine ( " P r o c u r a r . . . " );
29 // FindFunction () ;
30 }
31 }
O comando if com a cláusula else única pode ser encontrado em sua forma reduzida com
operador ternário representado por interrogação (?:). É chamado de operador ternário por pos-
suir 3 expressões: a primeira refere-se a condição boolena, a segunda se a condição é verdadeira
e a terceira se a condição é falsa.
O comando switch utiliza o valor de uma determina expressão contra uma lista de valores
constantes para execução de um ou mais comandos. Os valor constante é tratado através da
cláusula case e este pode ser númerico, caracter ou string. A cláusula default é utilizada para
Apostila C# 21
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
22
qualquer caso não interceptado pelo case. O exemplo abaixo implementa a versão com o comando
switch do exemplo, previamente mostrado com o comando if :
18 // InsertFunction () ;
19 break ;
20 case ’ 2 ’:
22 // UpdateFunction () ;
23 break ;
24 case ’ 3 ’:
26 // DeleteFunction () ;
27 break ;
28 default :
29 Console . WriteLine ( " P r o c u r a r . . . " );
30 // FindFunction () ;
31 }
32 }
Uma ou mais cláusulas case podem ser encontradas seguidamente quando mais do que uma
opção é permitida para um comando ou bloco de comandos. O exemplo abaixo apresenta essa
Apostila C# 22
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
23
condição:
5 break ;
6 case " MSDE ":
11 }
A cláusula break , é utilizada para separar os blocos do switch e garante que o bloco seja
executado somente até determinado ponto.
O comando for possui 3 declarações opcionais, separadas por ponto e vı́rgula (;), dentro dos
parênteses: inicialização, condição e a iteração. Em cada parâmetro, mais de uma expressão
pode ser encontrada separada por vı́rgula.
6 }
Apostila C# 23
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
24
7 for ( int y =100 , int x = 0; x < y ; ++ x , --y ) { // Laço com mais de 1 variável
8 System . Console . WriteLine ( y ) ;
9 }
Quando a cláusula for é processada pela primeira vez, se presente, a expressão ou expressões
da declaração inicializadora são executadas na ordem que elas estão escritas, este passo ocorre
apenas uma vez. Se a declaração condicional estiver presente, será avaliada, caso contrário
o for assume o valor verdadeiro (true). Na avaliação, se o valor obtido for verdadeiro (true) o
comando ou bloco de comandos associados serão executados, ao seu final a terceira declaração ou
declaração de iteração é processada e, então, novamente a declaração condicional é processada.
Este fluxo ocorre continuamente até que a declaração condicional seja avaliada como falsa (false)
ou o comando break seja encontrado, como visto anteriormente. O comando continue força uma
nova iteração.
de F i b o n a c c i : " );
Apostila C# 24
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
25
24 }
25 }
26 }
de F i b o n a c c i : " );
24 }
25 }
26 }
Apostila C# 25
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
26
7 OPERADORES
C# é uma linguagem muito rica em operadores. Estes representados por sı́mbolos são
utilizados na construção de expressões. A sintaxe de expressão do C# é baseada na sintaxe
do C++. Os operadores são categorizados em diversas funcionalidades. A tabela 3 apresenta
essas divisões.
Quando uma expressão possui múltiplas operações, a precedência dos operadores é levada
em consideração na avaliação da mesma. Normalmente, as expressões são avaliadas da esquerda
para direita, exceto para operações de atribuição e condicional, porém a precedência pode ser
alterada através do uso do parênteses.
Apostila C# 26
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
27
Tabela 3: Operadores do C#
Categoria Operadores
Aritmética &+-*/%
Lógica (boolena e bitwise) &|ˆ! && || true false
Concatenação de string +
Incremento e decremento ++ –
Shift << >>
Relacional == != <> <= >=
Atribuição = += -= *= /= %= &= —= =
ˆ <<= >>=
Acesso a membro .
Indexação []
Indexação ()
Condicional ?:
Delegate (concatenação e remoção) +-
Delegate (concatenação e remoção) new
Informação de tipo is sizeof typeof
Controle de excessão de overflow checked unchecked
Indireção e endereço * -¿ [] &
Os operadores aritméticos são utilizados na maioria das expressões para execução de cálculos.
Numa expressão, eles podem produzir resultados fora da faixa de valores. Neste caso, uma
excessão como OverflowException é gerada.
Os operadores unários (atribuı́dos a 1 atributo) + e - são utilizados para representar se o
número é positivo ou negativo, respectivamente.
Apostila C# 27
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
28
expressão e nenhuma operação de cast for executada a operação é tratado como concatenação.
O operador binário % é computado através da fórmula dividendo - ( dividendo / divisor ) *
divisor. Os exemplos abaixo ilustram essas condições:
Apostila C# 28
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
29
46 }
47 }
Apostila C# 29
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
30
6 ++ x ; // x = 1001
7 --x ; // x = 1000
8 y = ++ x ; // x = 1001 , y = 1001
Os operadores relacionais ==, !=, ¡, ¿, ¡=, ¿=, resultam em um valor booleano e representam
igual, não igual ou diferente, menor, maior, menor ou igual e maior ou igual, respectivamente.
Por exemplo, a == b quer dizer se a for igual a b, isto é totalmente válido na expressão com
tipos primitivos(value types), tais como int, long, char, entre outros. Porém o comportamento
dos operadores == e != são diferenciados quando utilizado entre structs (value types) e classes
(reference types). Para structs a comparação deve levar em consideração todos os campos da
estrutura. Para classes a comparação é efetuada pelo endereço, ou referência, da classe. O único
reference type que compara o valor e não a referência é a string ou a classe System.String, pois
os operadores == e != são sobrecarregados. A sobrecarga pode alterar o comportamento padrão
dos operadores.
Apostila C# 30
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
31
2 int y = x ;
3 int z = x + y ;
Apostila C# 31
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
32
7 }
8 }
Após aplicadas as regras de nomenclaturas, além de saber o que significa cada variável e
método, conseguimos ler sem dificuldade as palavras sem os espaços que as separam.
Para a nomenclatura de classes, como visto no exemplo, deve-se utilizar o seguinte padrão:
Primeiro caractere de cada palavra em caixa alta. Chamada de notação PascalCasing.
Para a nomenclatura de métodos, utiliza-se: Primeira letra de cada palavra em caixa alta,
menos da primeira. Chamada de notação camelCasing.
• Não crie variáveis com o mesmo nome mudando somente entre maiúsculas e minúsculas;
• Evite utilizar todas as letras maiúsculas (normalmente utilizado para definir constantes);
• Notação camelCasing.
8.2 Classes
Uma classe é um poderoso tipo de dado em C#. Como estrutura, uma classe define os dados
e o comportamento dos tipos de dados.
Uma classe em C# tem a seguinte estrutura:
Apostila C# 32
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
33
8.3 Propriedades
As propriedades são recursos fornecidos pelas classes para que seja possı́vel alterar seus
valores.
Os recursos get e set comuns às propriedades.
Veja como é possı́vel se definir esses recursos:
Apostila C# 33
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
34
1. private: Significa que, exceto a classe incluı́da, nada pode acessar o objeto, método ou
variável;
3. protected : Significa que são apenas visı́veis para as classes derivadas por meio de herança;
4. internal : todos têm acesso livre a este membro dentro de um assembly (DLL ou EXE;
correspondente ao JAR do Java). Fora do assembly a classe é inacessı́vel.
Atributos internal, são utilizados geralmente para a criação de bibliotecas, já que uma bibli-
oteca pode ter vários namespaces.
O exemplo a seguir mostra como devemos dispor os modificadores de visibilidade:
8.5 Herança
A herança é um recurso utilizado para derivar classes que têm métodos ou atributos em
comum. Sua principal vantagem é o reaproveitamento de código.
Para ilustrar a utilização do recurso de herança, imagine a seguinte situação:
[?]m um determinado programa, deve-se implementar as seguintes classes: Fornecedor(id,
cnpf, rua, numero, bairro, telefone, email, gerente) e Cliente(id, cpf, rua, numero, bairro, te-
lefone, email, limiteDeCompras). O programa deve cadastrar essas informações, bem como
consulta-las e imprimi-las.
Se o programador optar por utilizar herança, os atributos e métodos em comum:
Apostila C# 34
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
35
• Atributos:
– rua;
– numero;
– bairro;
– telefone;
– email.
• Metodos:
– cadastrar();
– consultar();
– imprimir().
Poderiam ser escritos em uma ”Pai” chamada Pessoa que derivaria as duas classes filhas
Fornecedor e Cliente.
Em C# todas as classes derivam da classe Object.
Sua declaração deve acontecer da seguinte maneira:
As cláusulas this e base são referências que indicam a propria classe e a classe base, respec-
tivamente.
Entende-se como classe base, a classe cuja a classe atual herda as propriedades e atributos.
Sua notação pode ser observada no seguinte exemplo:
Apostila C# 35
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
36
5 base . n o m e A t r i b u t o C l a s s e B a s e = valor ;
6 valor = base . n o m e A t r i b u t o C l a s s e B as e ;
7 base . N o m e Me t o d o C l a s s e B a s e () ;
Para se instanciar um objeto deve-se utilizar a operação new. Essa operação atribui um
<objeto> montado dentro de uma variável do tipo <objeto>.
Utiliza-se a seguinte notação:
Para acessar seus atributos e métodos utilizamos a instrução ”.”, como pode ser observado
no exemplo a seguir:
Entretanto como já foi explanado, atributos com modificador de acesso do tipo private não
possibilitam o acesso direto, para isso devemos utilizar as propriedades explanadas na sessão
8.3.
Apostila C# 36
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
37
São operadores utilizados para a criação de constantes, cujos os valores não poderão ser
alterados durante a execução do programa.
Algumas diferenças entre os operadores:
• const:
• readonly:
A classe abstrata é um tipo de classe que somente pode ser herdada e não instanciada, de
certa forma pode se dizer que este tipo de classe é uma classe conceitual que pode definir funci-
onalidades para que as suas subclasses (classes que herdam desta classe) possam implementa-las
de forma não obrigatória, ou seja ao se definir um conjunto de métodos na classe abstrata não
é de total obrigatoriedade a implementação de todos os métodos em suas subclasses, em uma
classe abstrata os métodos declarados podem ser abstratos ou não, e suas implementações de-
vem ser obrigatórias na subclasse ou não, quando criamos um método abstrato em uma classe
abstrata sua implementação é obrigatória, caso você não implemente o mesmo o compilador
criará um erro em tempo de compilação.
O mesmo se têm com métodos abstratos, não se pode herda-los.
Apostila C# 37
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
38
8.10 Interfaces
Apostila C# 38
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
39
3 void ExemploMetodo () ;
4 }
5 class I m p le m e n ta c a oC l a s se : IE xemploInterface
6 {
7 // Implementaç~
a o explicita da interface
8 void IE xempl oInte rface . ExemploMetodo ()
9 {
10 // Implementaç~
a o do método
11 }
12 static void Main ()
13 {
14 // Declarando uma instancia de uma interface
15 IEx emploI nterf ace obj = new ImplementacaoClasse () ;
16 // chame o método .
17 obj . ExemploMetodo () ;
18 }
19 }
Quando queremos possibilitar a algum método que ele seja sobrescrito, utilizamos o operador
virtual. Os métodos virtuais podem possuir corpo.
Caso um método não seja declarado como virtual ou abstract não será possı́vel a sua sobres-
crita.
Uma classe selada é utilizada para restringir caracterı́sticas da herança do objeto, quando
uma classe é definida como sealed , está classe não poderá ser herdada, caso você tente o
compilador criara um erro em tempo de compilação, após criar uma classe selada pode se observar
que o intelisense (famoso ctrl + espaço) não mostra o nome da classe definida como sealed quando
você tenta criar uma herança para novas classes.
Apostila C# 39
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
40
Classes Abstratas podem adicionar mais funcionalidades, sem destruir as funcionalidades das
classes filhos que poderiam estar usando uma versão mais antiga. Elas fornecem uma maneira
simples e fácil para versionar nossos componentes. Através da atualização da classe base, todas
as classes que herdam são atualizadas automaticamente com a mudança.
Em uma interface, a criação de funções adicionais terá um efeito sobre suas classes filhos,
devido à necessidade de implementação dos Métodos criados na interface.
Classes abstratas deveriam ser usadas principalmente para objetos que estão estritamente
relacionados, enquanto o uso de interfaces é mais adequado para fornecer funcionalidade comum
a classes independentes. Digamos que existem duas classes, de passaros e de aviões, e nas duas
existam os métodos chamados voar(). Seria estranho para uma classe aviões herdar a partir de
umas classe passaros apenas porque necessita do método voar(). Em vez disso, o método voar()
deve ser definido em uma interface e em ambas as classes passaros e aviões devem implementar
a interface. Se queremos proporcionar uma funcionalidade em comum para os componentes,
devemos utilizar uma classe abstrata.
Classes abstratas nos permite implementar parcialmente uma classe, enquanto a interface
não contem a implementação de qualquer membro. Por isso, a seleção de interface ou clas-
ses abstratas depende das necessidades e design do nosso projeto. Podemos fazer uma classe
Apostila C# 40
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
41
O comando throw é utilizado para disparar ou sinalizar a ocorrência de uma situação ines-
perada durante a execução do programa, ou seja uma excessão. O parâmetro seguido deve ser
da classe System.Exception ou derivada.
Apostila C# 41
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
42
Apostila C# 42
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
43
Uma ou mais instruções catch são colocadas logo abaixo do bloco try para interceptar uma
excessão. Dentro do bloco catch é encontrado o código de tratamento da excessão. O tratamento
da excessão trabalha de forma hierárquica, ou seja quando uma excessão é disparada, cada catch
é verificado de acordo com a excessão e se a excessão ou derivada dela é encontrada o bloco será
executado e os outros desprezados, por isso, na implementação é muito importante a sequência
dos blocos catch. O catch também pode ser encontrado na sua forma isolada, tratando qualquer
excessão não detalhada.
s o r t e a d o : " );
6 try {
7 iMax = Console . ReadLine () . ToInt32 () ;
8 Random r = new Random () ; // Inst^
a ncia a classe Random
9 int iRand = r . Next (1 , iMax ) ; // Sorteia rand^
o mincamente entre 0 e máximo
10 Console . Write ( " O valor sorteado entre 1 e {1} é {0} " , iRand , iMax ) ;
11 }
12 catch ( ArgumentE xception ) {
13 Console . WriteLine ( " 0 n~
ao é um valor v á l i d o " ) ;
14 }
15 catch ( Exception e ) {
16 Console . WriteLine ( e ) ;
17 }
18 }
19 }
Apostila C# 43
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
44
9 }
10 Console . WriteLine ( " Esta linha n~
ao s e r á e x e c u t a d a . . . " );
11 }
12 }
Os comandos try, catch e finally podem ser utilizados em conjunto, como pode ser visto no
proximo exemplo:
Apostila C# 44
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
45
14 catch ( N u l l R e f e r e n c e E x c e p t i o n ) {
15 // Tratamento aqui
16 }
17 catch ( Exception e ) {
18 // Tratamento aqui
19 Console . WriteLine ( " Excess~
ao ocorrida no programa {0} " , e);
20 }
21 finally {
22 Console . WriteLine ( @ " Gravando o Documento no C : \ . . . " ); // Uso do verbatim ( @ )
23 doc . Save ( @ " c : \ e x c e p t i o n . x m l " ); // Grava o conteúdo
24 }
25 Console . WriteLine ( " Esta linha n~
ao s e r á e x e c u t a d a . . . " );
26 }
27 }
A forma mais comum e generalizada de disparo de uma excessão é através da classe base
Exception. Ela fornece as informações necessárias para tratamento das excessões, possuindo
alguns membros, métodos e propriedades, que trazem as informações necessárias decorrentes do
erro. Normalmente uma instância de classe, ou derivada, é utilizada através de um bloco catch,
como vimos nos exemplos anteriores.
Vamos descrever alguns membros da classe Exception:
• Source: possui ou define a uma string com o texto da origem(aplicação ou objeto) do erro.
• HelpLink : possui uma string com o link(URN ou URL) para arquivo de ajuda.
Apostila C# 45
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
46
17 throw e . InnerException ;
18
21
22 throw e . GetBaseException () ;
23
10 MANIPULAÇÃO DE ARQUIVOS
Apostila C# 46
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
47
informações de um arquivo.
A seguir estão listadas algumas propriedades e métodos que essas classes oferecem:
Apostila C# 47
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
48
2 try {
3 dir . Cr ea teSu bdir ecto ry ( " S u b " );
5 }
6 catch ( IOException e ) {
7 Console . WriteLine ( e . Message ) ;
8 }
3 Console . WriteLine ( " Total number of bmp files " , bmpfiles . Length ) ;
4 Foreach ( FileInfo f in bmpfiles )
5 {
6 Console . WriteLine ( " Name is : {0} " , f . Name ) ;
7 Console . WriteLine ( " Length of the file is : {0} " , f . Length ) ;
8 Console . WriteLine ( " Creation time is : {0} " , f . CreationTime ) ;
9 Console . WriteLine ( " Attributes of the file are : {0} " ,
10 f . Attributes . ToString () ) ;
11 }
Apostila C# 48
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
49
Com a classe FileInfo, é possı́vel criar novos arquivos, acessar suas informações, exclui-los e
move-los. Essa classe também oferece métodos para abrir, ler e escrever um arquivo.
O seguinte exemplo mostra como é possı́vel criar um arquivo texto e acessar suas informações.
8 Console . Read () ;
9 fstr . Close () ;
10 fi . Delete () ;
Com o método Open(), disponı́vel na classe FileInfo, é possı́vel abrir um arquivo. Deve-se
passar no construtor, o modo de abertura e acesso ao arquivo.
O seguinte exemplo ilustra essa situação:
Ao abrir ou criar nossos arquivos, o atribuı́mos para a classe FileStream. Ela pode escrever
ou ler arquivos, com a ajuda das classes StreamWriter e StreamReader.
O exemplo a seguir ilustra como isso é possı́vel:
Apostila C# 49
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
50
1 FileStream fs = new FileStream ( @ " c :\ mcb . txt " , FileMode . OpenOrCreate , FileAccess .
Write ) ;
2 StreamWriter sw = new StreamWriter ( fs ) ;
3 sw . write ( " t e s t e " );
5 sw . Close () ;
6
7 FileStream fs = new FileStream ( @ " c :\ mcb . txt " , FileMode . OpenOrCreate , FileAccess .
Write ) ;
8 StreamReader sr = new StreamReader ( fs ) ;
9 string texto ;
10 texto = sr . ReadToEnd () ;
11 sr . Close () ;
2 StreamReader txtR ;
3 txtR = fi . OpenText () ;
4 string read = null ;
5 while (( read = txtR . ReadLine () ) != null ) {
6 Console . WriteLine ( read ) ;
7 }
8 s . Close () ;
9 // Método ReadToEnd () ;
10 Console . WriteLine ( txtR . ReadToEnd () ) ;
11
13 StreamWriter txtW ;
14 txtW = fi . CreateText () ;
15 txtW . Write ( " t e s t e " );
16 txtW . Close () ;
Apostila C# 50
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
51
• MDI (Multiple Document Interface): Aplicação que suporta múltiplos documentos abertos
simultaneamente, como o Word por exemplo.
• SDI (Single Document Interface): Aplicação que permite a abertura de apenas um docu-
mento de cada vez. Exemplo: O Paint do Windows, a calculadora, o Internet Explorer.
As aplicações MDI têm como objetivo criar várias instâncias (filhos) dentro de uma aplicação
principal (pai). Por esse motivo temos que seguir alguns passos para configurar esse ambiente.
Para definir uma janela como principal (janela pai) altera-se a propriedade isMdiContainer
= true ainda em tempo de compilação.
Para adicionar uma nova janela filha, devemos inserir um novo formulário ao projeto: menu
File/Add > New Item, selecione Windows Forms.
Ao instanciarmos uma nova janela filha utilizamos a seguinte codificação:
4 myWnd . Show () ;
• Criamos uma nova instância do formulário que constitui a nossa janela filha;
Apostila C# 51
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
52
Para fechar uma janela filha MDI ativa utiliza-se a seguinte notação:
Sempre que você cria uma Windows Application um formulário já é criado por padrão, ele
é conhecido como formulário Base.
Para adicionar um novo formulário no seu programa você:
1. Na janela Solution Explorer, clique com o botão direito no nome do projeto, selecione Add
e clique em Windows Form;
Vamos fazer um exemplo que ilustra como podemos trabalhar com múltiplos formulário:
5. Mude o nome do Form2 para frmVermelho e do Form3 para frmVerde. Para isso clique
sobre o nome do Form no Solution Explorer e clique em Rename;
Apostila C# 52
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
53
• Se a uma mensagem de confirmação aparecer, clique em Sim. Isso vai atualizar todas
as referencias ao form do projeto para o novo nome.
8. No Form1 de um clique duplo sobre o botão Vermelho e digite o seguinte código dentro
do procedimento do evento click :
Note que para a chamada de um formulário é necessário que o mesmo seja instanciado.
Com o formulário Vermelho aberto, perceba que você pode clicar novamente no Form1 e
depois voltar para o Vermelho e assim por diante, o que não acontece com o formulário Verde.
Isso porque usamos o método ShowDialog ao invés do método Show.
2. Vá para o painel de código do frmVermelho e dentro da classe frmVermelho digite o seguinte
código:
Apostila C# 53
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
54
5. Volte para o frmVermelho, de um clique duplo sobre o button1 e digite o seguinte código
no procedimento:
6. Execute a aplicação.
O conteúdo da variável foi exibida no label1. O mais importante desta lição é que você agora
é capaz de passar valores entre formulários.
Por questões de estética, temos a possibilidade de alterar algumas propriedades dos com-
ponentes para que eles se tornem mais apresentáveis. O posicionamento de formulário na tela
ilustra uma dessas possibilidades.
Vamos estudar algumas modificações na propriedade StartPosition.
• CenterScreen: Essa propriedade faz com que o formulário em questão seja exibido no
centro da tela;
• Manual : Deve-se especificar manualmente como os valores que serão usados para posicio-
nar o formulário na tela.
Apostila C# 54
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
55
Apostila C# 55
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
56
O ADO.NET é uma nova tecnologia baseada no ADO (Active Data Objects), com muito mais
recursos. O ADO.NET possui um modelo para manipulação de dados completamente diferente
da versão anterior do ADO, simplificando o processo de conexão e manipulação de dados.
A arquitetura do ADO.NET foi criada para trabalhar com um ambiente desconectado, ou
seja, buscamos as informações do banco de dados e trazemos para a memória da aplicação. A
manipulação dos dados é feita toda em memória e posteriormente enviada ao banco de dados.
Por trabalhar de uma forma voltada ao modelo desconectado, o ADO.NET possui uma
camada de persistência em XML. É possı́vel gravar e ler todo o conteúdo de todo um conjunto
de armazenado nas estruturas do ADO.NET em XML.
O ADO.NET faz parte do .NET Framework, e é composto por um conjunto de classes,
interfaces, tipos e enumerações.
Para trabalharmos com o ADO.NET em uma aplicação .NET, é necessário utilizarmos al-
gumas das namespaces disponı́veis nas bibliotecas do .NET Framework. Alguns dos principais
namespace são:
• System.Data.OleDb: Biblioteca de acesso para bancos de dados que suportam OleDb. Per-
mite conexão, a extração e a execução de comandos nestes bancos de dados. É necessário
informar o provedor OleDb a ser utilizado. Permite acesso a bancos mais simples, como o
Access;
Apostila C# 56
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
57
O ADO.NET provê uma estrutura de acesso a dados que permite o acesso a múltiplas bases
de dados simultaneamente. É possı́vel armazenar duas tabelas de diferentes bancos de dados
(SQL Server e Access por exemplo) em uma mesma estrutura de dados (DataSet).
A estrutura responsável pelo armazenamento dos dados é o DataSet, que contém um conjunto
de objetos (DataTables) que representam resultados tabulares extraı́dos da base de dados.
Para fazer a extração dos dados, o ADO.NET utiliza os chamados ”.NET Data Providers”.
Os Data Providers são bibliotecas de classes especializadas para o acesso a um tipo de banco
de dados relacional. Por serem uma implementação especı́fica para o banco de dados, estas
possuem um acesso bem mais eficiente do que outras bibliotecas como a OleDb.
Segue uma lista de data providers disponı́veis para os bancos citados:
Apesar de serem uma implementação especı́fica para um tipo de banco de dados, as classes
dos Data Providers possuem uma estrutura comum.
Apostila C# 57
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
58
O ADO.NET é capaz de trabalhar com dois modelos, o modelo conectado e o modelo des-
conectado. No modelo conectado é necessário manter a conexão aberta enquanto são realizadas
as operações de leitura e gravação.
Para trabalharmos em um modelo conectado, devemos observar alguns objetos disponı́veis
nas classes dos .NET Data Providers, que devem ser utilizados na seguinte ordem:
Apostila C# 58
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
59
O primeiro passo para criarmos uma aplicação com conexão a um banco de dados é esta-
belecer a conexão com o banco. Para estabelecermos a conexão, devemos criar um objeto de
conexão.
Ao criarmos uma instância da classe que irá se conectar, devemos informar uma string de
conexão, que contém todos os parâmetros para a conexão com o banco de dados, como usuário
e senha.
A string de conexão possui uma série de parâmetros, que pode variar de acordo com o banco
de dados utilizado. Os parâmetros da string de conexão são separados por ponto e vı́rgula, e
devem ser informados com a seguinte notação:
Abaixo está uma classe com string de conexão para os bancos MySQL, Firebird e Post-
GreSQL respectivamente:
Apostila C# 59
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
60
Host = localhost ; Port =5432; Database = dados ; Pooling = true ; Min Pool Size
8 }
Apostila C# 60
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
61
4 oCmd . ExecuteNonQuery () ;
O método ExecuteScalar é utilizado para comandos que retornam valores escalares, ou seja,
valores únicos. Em geral é utilizado para comandos que retornam uma contagem de registros
ou que executam ao comando de agregação no banco de dados.
Este comando pode retornar qualquer tipo de dado.
Um exemplo de utilização do comando ExecuteScalar pode ser observado a seguir.
4 int iNumProdutos ;
5 iNumProdutos = oCmd . ExecuteScalar () ;
Apostila C# 61
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
62
6 }
Apostila C# 62
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
63
P r o d u c t I d = @ P r o d u c t I d ";
O DataSet é uma classe capaz de armazenar múltiplos resultados tabulares em uma mesma
estrutura. O DataSet é composto por estruturas chamadas DataTables que representam estes
resultados tabulares.
Para extrairmos dados da base de dados e preenchermos o DataSet utilizamos a classe Da-
taAdapter. Esta classe é capaz de executar os quatro comandos básicos de um banco de dados
(Insert, Update, Delete, Select) sendo capaz de executar estas operações sobre os dados do
DataSet.
O DataAdapter é a classe responsável por fazer a interação entre a base de dados e o DataSet.
Ela possui quatro propriedades que representam os quatro comandos principais que utilizamos
para interagir com o banco de dados.
Para realizar a extração de dados do banco de dados para o DataSet, o DataAdapter usa o
comando de select, contido na propriedade SelectCommand.
Após extrairmos os dados para o DataSet, podemos modificar estes dados (que estão arma-
zenados em memória). À medida que modificamos os dados do DataSet, este faz uma marcação
Apostila C# 63
Apostila C#
Diogo Cezar Teixera Batista
20 de novembro de 2008
64
nas alterações que fazemos, marcando as linhas inseridas como inseridas, modificadas como mo-
dificados e excluı́dos como excluı́dos. Quando concluı́mos as alterações, é possı́vel chamar o
DataAdapter novamente para que ele execute para cada linha modificada o comando correspon-
dente a modificação realizada.
Quando criamos um DataAdapter é possı́vel informar uma query e uma conexão para a
extração dos dados. O SqlCommand referente à propriedade SelectCommand é criado automa-
ticamente. Os outros comandos devem ser criados manualmente.
Um exemplo de criação de um objeto DataAdapter pode ser observado a seguir.
Para criar um novo DataSet basta utilizar o comando New e criar um novo objeto. Para pre-
encher um dataset utilizando um DataAdapter, devemos utilizar o método Fill do DataAdapter,
informando o DataSet e nome da tabela a ser criada no DataSet.
Um exemplo de criação de um DataSet e utilização de um DataAdapter podem ser observados
a seguir.
Apostila C# 64