Introduction to C#

Download Report

Transcript Introduction to C#

Introdução à
#
Linguagem C
Prof.Dr. Antonio Geraldo da Rocha Vidal
EAD-5881 - Tecnologia de Informática
FEA/USP
Hello World
using System;
class Hello {
static void Main( ) {
Console.WriteLine(“Olá Mundo!");
Console.ReadLine(); // Enter para finalizar
}
}
Metas de projeto do C#




Orientação para componentes
Tudo é objeto
Construção de software robusto e durável
Integração ao software já existente,
preservando investimentos.
Metas de projeto do C#
Orientação para Componentes
 C# pode ser considerada uma linguagem orientada para
objetos e componentes da família do C/C++
 O que é um componente?


Um módulo independente quanto a desenvolvimento e
reutilização
Menos granulares que objetos





Os objetos são construções ao nível da linguagem
Os componentes são construções ao nível da aplicação
Inclui múltiplas classes
Freqüentemente independentes da linguagem
Em geral, o desenvolvedor e o usuário de componentes não se
conhecem, não trabalham para a mesma empresa e não
utilizam a mesma linguagem de programação
Metas de projeto do C#
Orientação para Componentes
 Conceitos de componentes:



Propriedades, métodos, eventos
Atributos de projeto (design-time) e de execução
(run-time)
Documentação integrada usando XML
 Permitem “one-stop programming”


Sem arquivos de cabeçalho, IDL, etc.
Podem ser embutidos nas páginas ASP
Metas de projeto do C#
Tudo é Objeto
 Visões tradicionais:


C++, Java™: os tipos primitivos são “mágicos” e não
interoperam com objetos
Smalltalk, Lisp: os tipos primitivos são objetos, mas
com um grande custo de desempenho
 C# unifica estas visões com bom desempenho

Grande simplicidade ao longo de todo sistema
 Extensibilidade e reusabilidade aprimorados:


Novos tipos primitivos: Decimal, SQL…
Coleções, etc., trabalham com todos os tipos
Metas de projeto do C#
Software Robusto e Durável
 Coletor de lixo

Nenhum vazamento de memória e ponteiros perdidos
 A manipulação de exceções é padronizada
 Estrutura “tipada” e segura

Nenhuma variável sem inicialização, nenhum conteúdo inseguro
 Versionamento
 Evita erros comuns

Por exemplo: if (x = y) ...
 Programação “sem escalas” (one-stop programming)

Menos “partes móveis”
Metas de projeto do C#
Preservar Investimentos
 Heranças do C++:


Namespaces, pointers (em código inseguro),
unsigned types, etc.
Algumas mudanças, mas nenhum sacrifício desnecessário
 Interoperabilidade


Todo software precisa estar integrado
C# fala com XML, SOAP, COM, DLLs, e
qualquer linguagem compatível com o .NET Framework
 Produtividade aumentada


Curva aprendizado pequena
Há milhões de linhas de código C# na plataforma .NET
Tipos de Objetos
Visão
 Um programa C# é uma coleção de tipos de
objetos:

Classes, structs, enums, interfaces, delegates
 C# fornece um conjunto de tipos predefinidos

Isto é: int, byte, char, string, object
 Você pode criar seus próprios tipos
 Todos os dados e códigos são definidos dentro
de um tipo de objeto:

Nenhuma variável global, nenhuma função global
Tipos de Objetos
Visão
 Os tipos de objeto podem conter:

Dados



Funções



Campos, constantes, arrays
Eventos
Métodos, operadores, construtores, destruidores
Propriedades, indexadores
Outros tipos

Classes, structs, enums, interfaces, delegates
Tipos de Objetos
Visão
 Os tipos de objetos podem ser instanciados:

…e então usados: chamar métodos,
obter e configurar propriedades, etc.
 Pode-se converter de um tipo de objeto para outro:

Implicitamente e explicitamente
 Os tipos de objetos são organizados fisicamente em
arquivos:

Namespaces, files, assemblies
 Os tipos são organizados logicamente em uma
hierarquia
 Existem duas categorias de tipos:
valor e referência
Tipos de Objetos
Sistema Unificado de Tipos
 Tipos de valor


Contém dados
Não podem ser nulos
 Tipos de referência


Contém referências a objetos
Podem ser nulos
int i = 123;
string s = “Olá pessoa!";
i
s
123
“Olá pessoal!"
Tipos de Objetos
Sistema Unificado de Tipos
 Tipos de valor



Primitivos
int i; float x;
Enumerações enum State { Off, On }
Estruturas
struct Point {int x,y;}
 Tipos de referência






Root
String
Classes
Interfaces
Arrays
Delegates
object
string
class Foo: Bar, IFoo {...}
interface IFoo: IBar {...}
string[] a = new string[10];
delegate void Empty();
Tipos de Objetos
Sistema Unificado de Tipos
Variável armazena
Alocou
Conteúdo
Valor padrão
Alias
= Significa
Pode herdar
Valor (Struct)
Referência (Class)
Valor real
Alocação na memória
Pilha, membro
“Ponteiro”
Sempre tem um valor
Pode ser nulo
0
null
Não
Sim
Cópia do valor
Cópia da referência
Não
Sim
Tipos de Objetos
Sistema Unificado de Tipos
 Benefícios de tipos de valor:




Nenhuma alocação volumosa
Uso mais eficiente da memória
Menos referência indireta
Sistema de tipo unificado

Sem a dicotomia PRIMITIVO X OBJETO
Tipos de Objetos
Conversões
 Conversões implícitas



Ocorrem automaticamente
Garantia de sucesso
Nenhuma perda na precisão das informações
 Conversões explícitas



Exige um elenco
Podem não ter sucesso
Informações (precisão) podem ser perdidas
 Ambas conversões implícitas e explícitas
podem ser definidas pelo usuário
Tipos de Objetos
Conversões
int x = 123456;
long y = x;
short z = (short)x;
// implícita
// explícita
double d = 1.2345678901234;
float f = (float)d;
long l = (long)d;
// explícita
// explícita
Tipos de Objetos
Sistema Unificado de Tipos
 Tudo é objeto:


Em última instância, todos os tipos são herdados de
objetos.
Qualquer pedaço de dados pode ser armazenado,
transportado, e manipulado sem trabalho extra.
o b ject
S tream
M em o ryS tream
H ash tab le
F ileS tream
in t
d o u b le
Tipos de Objetos
Sistema Unificado de Tipos
 Polimorfismo

A habilidade de usar ou armazenar um objeto sem
saber seu tipo preciso
void Poli(object o) {
Console.WriteLine(o.ToString());
}
Poli(42);
Poli(“abcd”);
Poli(12.345678901234m);
Poli(new Point(23,45));
Tipos de Objetos
Sistema Unificado de Tipos
 Observação: os tipos de valor e de referência
têm semântica muito diferentes
 Pergunta: como podemos tratar os tipos de valor
e de referência polimorficamente?


Como um int (tipo valor) pode ser convertido em um
objeto (tipo referência)?
Como podemos unificar tipos de valor e de
referência?
 Solução: Boxing!
Tipos de Objetos
Sistema Unificado de Tipos
 Boxing copia um tipo valor para um tipo
referência
 Unboxing faz a cópia inversa
int i = 123;
i
object o = i;
o
int j = (int)o;
123
System.Int32
123
j
123
Tipos de Objetos
Sistema Unificado de Tipos
 Boxing



Copia um tipo valor para um tipo referência (objeto)
Cada tipo valor tem o correspondente (“hidden”) tipo
referência
Note que uma cópia de valor referência é feita pelo
tipo valor.


Os tipos de valor nunca são aliased
O tipo valor é convertido implicitamente para objeto,
um tipo referência

Essencialmente um “up cast”
Tipos de Objetos
Sistema Unificado de Tipos
 Unboxing


Operação inversa de boxing
Copia o valor para fora do box


Cópia do tipo referência para o tipo valor
Exige uma conversão de explícita


Pode não ser bem-sucedido
Essencialmente um “down cast”
Tipos de Objetos
Sistema Unificado de Tipos
 Benefícios




Habilita polimorfismo através de todos os tipos
Classes de coleção trabalham com todos os tipos
Elimina a necessidade de classes para conversão
Substitui o OLE Automation's Variant
 Muitos exemplos na .NET Framework
Hashtable t = new Hashtable();
t.Add(0, "zero");
t.Add(1, "one");
string s = string.Format(
t.Add(2, "two");
“Sua nota foi {0} em um total
de {1}", date);
Tipos de Objetos
Pré-definidos
 Valor





Integral types
Floating point types
decimal
bool
char
 Referência


object
string
Tipos predefinidos
Tipos Valor
 Todos são estruturas (structs) predefinidas
Com sinal
sbyte, short, int, long
Sem sinal
byte, ushort, uint, ulong
Caractere
char
Ponto flutuante
Lógico
float, double, decimal
bool
Tipos predefinidos
Tipos Inteiros
Tipo C#
Tipo System
Tamanho (bytes)
Sinal?
sbyte
System.Sbyte
1
Sim
Short
System.Int16
2
Sim
Int
System.Int32
4
Sim
Long
System.Int64
8
Sim
Byte
System.Byte
1
Não
Ushort
System.UInt16
2
Não
Uint
System.UInt32
4
Não
Ulong
System.UInt64
8
Não
Tipos predefinidos
Tipos Ponto Flutuante
 Segue a especificação IEEE 754
 Suporta ± 0, ± Infinito, NaN
Tipo C#
Tipo System
Tamanho (bytes)
float
System.Single
4
double
System.Double
8
Tipos predefinidos
decimal
 128 bits
 Essencialmente um valor 96 bit elevado à uma
potência de 10
 Valores decimais são representados
precisamente
 Não suporta zeros com sinais, infinito ou NaN
Tipo C#
Tipo System
Tamanho (bytes)
decimal
System.Decimal
16
Tipos predefinidos
decimal
 Todos os tipos inteiro podem ser implicitamente
convertidos para um tipo decimal
 As conversões entre decimal e tipos flutuantes
exigem conversão explícita devido à
possibilidade de perda de precisão
e
 s * m * 10



s = 1 or –1
96
0m2
-28  e  0
Tipos predefinidos
Inteiros Literais
 Integer literals podem ser expressos como
decimal ou hexadecimal
 U ou u: uint ou ulong
 L ou l: long ou ulong
 UL ou ul: ulong
123
0x7B
123U
123ul
123L
//
//
//
//
//
Decimal
Hexadecimal
Unsigned
Unsigned long
Long
Tipos predefinidos
Reais Literais
 F ou f: float
 D ou d: double
 M ou m: decimal
123f
123D
123.456m
1.23e2f
12.3E1M
//
//
//
//
//
Float
Double
Decimal
Float
Decimal
Tipos predefinidos
booleano
 Representa valores lógicos
 Os valores literais são true e false
 Não se pode usar 1 e 0 como valores booleanos

Nenhuma conversão padrão entre outros tipos
e booleano
Tipo C#
Tipo System
Tamanho (bytes)
bool
System.Boolean
1 (2 for arrays)
Tipos predefinidos
char
 Representa um caractere Unicode
 Literais




‘A’
‘\u0041’
‘\x0041’
‘\n’
// Caractere simples
// Unicode
// Hexadecimal pequeno sem sinal
// Caractere ecape
Tipo C#
Tipo System
Tamanho (bytes)
Char
System.Char
2
Tipos predefinidos
char
 Caracteres de seqüência de fuga (lista parcial)
Char
Significado
Valor
\’
Aspa simples
0x0027
\”
Aspa dupla
0x0022
\\
Barra invertida
0x005C
\0
Nulo
0x0000
\n
Mudança de linha
0x000A
\r
Retorno do carro
0x000D
\t
Tabulação
0x0009
Tipos predefinidos
Tipos Referência
Tipo raiz (primitivo)
object
Cadeia de caracteres
string
Tipos predefinidos
object
 Raiz da hierarquia de objetos
 Armazenamento (book keeping)


0 bytes para tipos valor
8 bytes para tipos referência
 Uma referência real (não um objeto)
usa 4 bytes
Tipo C#
Tipo System
Tamanho (bytes)
object
System.Object
0/8 overhead
Tipos predefinidos
object Métodos Públicos








public bool Equals(object)
public bool ReferenceEquals(object)
protected void Finalize()
public int GetHashCode()
public System.Type GetType()
protected object MemberwiseClone()
public void Object()
public string ToString()
Tipos predefinidos
string
 Uma seqüência de caracteres Unicode
(“imutável”)
 Tipo referência
 Sintaxe especial para literais

string s = “Eu sou uma string”;
Tipo C#
Tipo System
Tamanho (bytes)
String
System.String
20 mínimo
Tipos predefinidos
string
 Normalmente precisam ser utilizados caracteres
de fuga:
string s1= “\\\\server\\fileshare\\filename.cs”;
 Strings literais:

A maioria de seqüências fuga são ignoradas


Com exceção de “”
Literais podem ter múltiplas linhas
string s2 = @“\\server\fileshare\filename.cs”;
Tipos de Objetos
Tipos Definidos pelo Usuário
 Tipos definidos pelo usuário
Enumerations
Arrays
Interface
enum
int[], string[]
interface
Reference type
class
Value type
struct
Function pointer
delegate
Tipos de Objetos
Enums
 Um enum define um tipo para um grupo relacionado de
constantes simbólicas
 As escolhas devem ser conhecidas em tempo de
compilação
 Fortemente tipado:



Nenhuma conversão implícita de/para int
Pode ser explicitamente convertido
Operadores: +, -, ++, --, &, |, ^, ~, …
 Pode especificar um tipo subjacente

byte, sbyte, short, ushort, int, uint, long, ulong
Tipos de Objetos
Enums
enum Color: byte {
Red
= 1,
Green = 2,
Blue = 4,
Black = 0,
White = Red | Green | Blue
}
Color c = Color.Black;
Console.WriteLine(c);
Console.WriteLine(c.Format());
// 0
// Black
Tipos de Objetos
Enums
 Todos enums derivam de System.Enum

Fornece métodos para:





Determinar o tipo subjacente
O testar se um valor é suportado
Inicializar a partir de uma constante string
Recuperar todos os valores em enum
…
Tipos de Objetos
Arrays
 Os arrays (vetores) permitem que um grupo de
elementos de um tipo específico sejam
armazenados em um bloco contíguo de
memória
 Os vetores são tipos de referência
 Derivados de System.Array
 Baseados em Zero
 Podem ser multidimensionais

Os vetores sabem seu comprimento(s) n e grau
 Permite verificação de limites de dimensões
Tipos de Objetos
Arrays
 Declaração
int[] primes;
 Alocação
int[] primes = new int[9];
 Inicialização
int[] prime = new int[] {1,2,3,5,7,11,13,17,19};
int[] prime = {1,2,3,5,7,11,13,17,19};
 Atribuição e acesso
prime2[i] = prime[i];
 Enumeração
foreach (int i in prime) Console.WriteLine(i);
Tipos de Objetos
Arrays
 Arrays Multidimensionais

Retangular




int[,] matR = new int[2,3];
Pode ser inicializado declarativamente
int[,] matR =
new int[2,3] { {1,2,3}, {4,5,6} };
Dentado



Um array de arrays
int[][] matJ = new int[2][];
Deve ser inicializado proceduralmente
Tipos de Objetos
Interfaces
 Uma interface define um contrato


Inclui métodos, propriedades, indexadores, eventos
Qualquer classe ou estrutura implementando uma
interface deve suportar todas as cláusulas do
contrato
 Interfaces fornecem polimorfismo

Muitas classes e estruturas podem implementar uma
particular interface
 Não contém nenhuma implementação

Devem ser implementadas por uma classe ou
estrutura
Tipos de Objetos
Classes
 Um tipo de referência definida pelo usuário

Similar às classes do C++ e Java
 Aceitam herança simples de uma única super
classe
 Aceitam herança múltipla de várias interfaces
Tipos de Objetos
Classes
 Membros



Constantes, dados, métodos, operadores,
construtores e destrutores
Propriedades, indexadores e eventos
Membros estáticos e instanciados
 Acesso aos membros

public, protected, private, internal,
protected internal

O padrão é private
 Instanciadas através do operador new
Tipos de Objetos
Estruturas (Structs)
 Similar às classes, mas:


Tipo de valor definido pelo usuário
Herança sempre a partir de um ValueType
 Ideal para objetos “leves” ou “primitivos”


int, float, double, etc., são todos structs
Tipos primitivos definidos pelo usuário

Complex, point, rectangle, color, rational
 Herança múltipla de interfaces
 Possuem os mesmos membros de uma classe
 Acesso aos membros

public, internal, private
 Instanciadas através do operador new
Tipos de Objetos
Classes e Structs
struct SPoint { int x, y; ... }
class CPoint { int x, y; ... }
SPoint sp = new SPoint(10, 20);
CPoint cp = new CPoint(10, 20);
sp
10
20
cp
CPoint
10
20
Tipos de Objetos
Delegates
 Um delegate é um tipo de referência que define
uma assinatura a um método
 Quando instanciada, uma delegate contém um
ou mais métodos

Essencialmente um apontador de funções orientado
para objetos.
 Base fundamental para tratamento de eventos
Estrutura de Programação
Introdução





Organizando Tipos
Namespaces
References
O Método Main
Sintaxe
Estrutura de Programação
Organizando Tipos
 Organização física:



Os tipos de objetos
(type) são definidos em
arquivos (file).
Os arquivos são
compilados em
módulos (module).
Os módulos são
agrupados em
montagens (assembly).
Assembly
Module
File
Type
Estrutura de Programação
Organizando Tipos
 Os tipos são definidos em arquivos:


Um arquivo pode conter múltiplos tipos
Cada tipo é definido em um único arquivo
 Os arquivos são compilados em módulos:


Um módulo é uma DLL ou um EXE
Um módulo pode conter múltiplos arquivos
 Os módulos são agrupados em assemblys:


Um assembly pode conter múltiplos módulos
Os assemblys e os módulos são sempre 1:1
Estrutura de Programação
Organizando Tipos
 Os tipos são definidos em UM lugar:





“One-stop programming”
Nenhum arquivo de cabeçalho (header) ou arquivo
de código-fonte para sincronizar.
O código é escrito “in-line”
A declaração e a definição são uma mesma e única
instrução.
Um tipo deve estar completamente definido em um
arquivo.

Não se pode por métodos individuais em arquivos diferentes
 Nenhuma declaração exige dependência

Nenhuma referência futura é exigida
Estrutura de Programação
Namespaces
 Namespaces fornecem um modo para identificar
um tipo de forma exclusiva.
 Fornece organização lógica de tipos:


Namespaces podem estar em vários assemblies
Namespaces podem ser aninhados
 Não existe nenhuma relação entre namespaces
e estruturas de arquivo (diferentemente do que
ocorre em Java).
 Um nome de tipo completamente qualificado
inclui todos os namespaces.
Estrutura de Programação
Namespaces
namespace N1 {
class C1 {
class C2 {
}
}
namespace N2 {
class C2 {
}
}
namespace N3.N4 {
class C2 {
}
}
}
// N1
// N1.C1
// N1.C1.C2
// N1.N2
// N1.N2.C2
// N1.N3.N4
// N1.N3.N4.C2
Estrutura de Programação
Namespaces
 A diretiva using permite que você utilize tipos
de objetos diferentes sem precisar digitar toda a
qualificação do nome de um objeto.
 Porém, sempre que quiser, você pode usar um
nome completamente qualificado.
using N1;
C1 a;
N1.C1 b;
// O N1. está implícito
// Nome qualificado
C2 c;
N1.N2.C2 d;
C1.C2 e;
// Erro! C2 está indefinido
// Um objeto da classe C2
// Um outro
Estrutura de Programação
Namespaces
 A diretiva using também permite que você crie
nomes alternativos (aliases).
using MeuC1 = N1.N2.C1;
using MeuN2 = N1.N2;
MeuC1 a;
MeuN2.C1 b;
// Refere-se a N1.N2.C1
// Refere-se a N1.N2.C1
Estrutura de Programação
Namespaces
 Melhor prática: ponha todos os seus tipos em
um único namespace.
 Tenha um namespace específico para sua
empresa, projeto, produto, etc.
 Estude como as classes do .NET Framework
são organizadas e se inspire nelas para criar a
organização de classes da sua empresa,
projeto, produto, etc.
Estrutura de Programação
Referências
 No Visual Studio você especifica referências
para um projeto.
 Cada referência identifica um específico
assembly.
 Passada como referência (/r ou /reference)
para o compilador do C#.
csc HelloWorld.cs /reference:System.WinForms.dll
Estrutura de Programação
Namespaces vs. Referências
 Namespaces fornecem a capacidade de utilizar
abreviações de nomenclaturas a nível de
linguagem.

Para que você não tenha que digitar um nome longo,
completamente qualificado, repetidas vezes.
 As referências especificam que assembly deve
ser utilizado.
Estrutura de Programação
O Método Main
 A execução começa com o método estático
Main().
 Normalmente, pode haver só um método com
uma das seguintes assinaturas em um assembly:




static
static
static
static
void Main()
int Main()
void Main(string[] args)
int Main(string[] args)
 Porém, você pode ter múltiplas classes, cada
com uma com um método Main, se você usar o
comando /main para especificar a classe a usar.
Estrutura de Programação
Sintaxe
 Identificadores:






Nomes para tipos, métodos, dados, etc.
Deve ser uma palavra inteira – sem nenhum espaço
em branco.
Caracteres Unicode
Começa com uma letra ou com o sublinhado (_Teste)
Sensível a letras maiúsculas e minúsculas (case
sensitive).
Não devem ser utilizadas palavras-chave reservadas

A menos que prefixadas com @
Comandos
Introdução




Alta fidelidade ao C++
if, while, do requerem uma condição bool
goto não pode saltar para blocos
Comando switch

Não permite falha
 Comando foreach
 Comandos checked e unchecked
 Conjuntos de
void Foo()
i == 1;
comandos devem
}
fazer o trabalho.
{
// erro
Comandos
Introdução




Seqüências de comandos
Blocos de comandos
Comandos rotulados
Declarações:


Constantes
Variáveis
 Expressões de comandos:



checked, unchecked
lock
using
 Comandos para condições:


if
switch
 Comandos para repetições:




while
do
for
foreach
 Comandos para desvios:





break
continue
goto
return
throw
 Tratamento de exceções:


try
throw
Comandos
Sintaxe
 Linhas de comandos são finalizadas com um
ponto-e-vírgula (;)
 Da mesma forma que C, C++ e Java
 Blocos de comandos { ... } não precisam de
um ponto-e-vírgula.
Comandos
Sintaxe
 Comentários:
// Comenta uma só linha, estilo C++
/* Comenta múltiplas
linhas,
estilo C
*/
Comandos
Seqüências & Blocos de Comandos
 Seqüência de comandos: um ou mais
comandos em seqüência.
 Bloco de comandos: uma seqüência de
comandos delimitados por chaves { ... }
static void Main() {
F();
G();
{
// Início do bloco
H();
;
// Comando vazio
I();
}
// Fim do bloco
}
Comandos
Variáveis e Constantes
static void Main() {
const float pi = 3.14;
const int r = 123;
Console.WriteLine(pi * r * r);
int a;
int b = 2, c = 3;
a = 1;
Console.WriteLine(a + b + c);
}
Comandos
Variáveis e Constantes
 O escopo de uma variável ou constante é válido
do ponto da sua declaração até o fim do bloco onde foi
declarada.
 Dentro deste escopo, será gerado um erro se for
declarada outra variável ou constante com o mesmo
nome.
{
int x;
{
int x;
}
}
// Erro: não é possível
//
redefinir a variável x
Comandos
Variáveis
 Um valor deve ser atribuído às variáveis antes
delas poderem ser usadas.


Explicitamente ou automaticamente
Camada definição de atribuição (definite assignment)
 Atribuição automática ocorre apenas para dados
estáticos, classes, instâncias de classes e
elementos de arrays.
void Foo() {
string s;
Console.WriteLine(s);
}
// Erro
Comandos
Comandos Rotulados & goto
 O comando goto pode ser usado para transferir o
controle para dentro ou para fora de um bloco, mas não
em um bloco aninhado.
static void Acha(int valor, int[,] valores,
out int linha, out int coluna) {
int i, j;
for (i = 0; i < valores.GetLength(0); i++)
for (j = 0; j < valores.GetLength(1); j++)
if (valores[i, j] == valor) goto Achei;
throw new InvalidOperationException(“Não achado");
Achei:
linha = i; coluna = j;
}
Comandos
Expressões em Comandos
 Comandos devem executar trabalhos

Atribuição de valores, chamadas de métodos, ++, --,
new etc.
static void Main() {
int a, b = 2, c = 3;
a = b + c;
a++;
MinhaClass.Foo(a,b,c);
Console.WriteLine(a + b + c);
a == 2;
// ERRO!
}
Comandos
Comando if
 Exige uma expressão lógica (bool):
int Teste(int a, int b) {
if (a > b)
return 1;
else if (a < b)
return -1;
else
return 0;
}
Comandos
Comando switch
 Pode ramificar sobre qualquer tipo predefinido
(inclusive string) ou enum

Os tipos definidos pelo usuário podem fornecer
conversão implícita para estes tipos.
 Deve definir explicitamente como finalizar um
caso ou ramificação:



Com break, goto case, goto label, return,
throw ou continue
Elimina falhas e bugs
Não necessita if nenhum código é provido depois do
rótulo.
Comandos
Comando switch
int Teste(string rotulo) {
int resultado;
switch(rotulo) {
case null:
goto case “ausente”;
case “mais rápido”:
case “vencedor”:
resultado = 1; break;
case “ausente”:
resultado = 2; break;
default:
resultado = 0;
}
return resultado;
}
Comandos
Comando while
 Exige uma expressão lógica (boleana)
int i = 0;
while (i < 5) {
...
i++;
int i = 0;
}
do {
...
i++;
}
while (i < 5);
while (true) {
...
}
Comandos
Comando for
 Exatamente como em C, C++ e Java
for (int i=0; i < 5; i++) {
...
}
for (;;) {
...
}
Comandos
Comando foreach
 Fornece simplicidade para manipulação de
vetores e matrizes (arrays).
public static void Main(string[] args) {
foreach (string s in args)
Console.WriteLine(s);
}
Comandos
Comando foreach
 Manipulação de coleções definidas pelo usuário.
 Criadas através da implementação de
IEnumerable
foreach (Cliente c in Clientes.OrderBy("nome")) {
if (c.Pedidos.Count != 0) {
...
}
}
Comandos
Comandos de Desvio
 break

Saída da repetição (loop) mais interna
 continue

Finaliza a repetição (loop) mais interna
 goto <label>

Transfere a execução para o comando rotulado
 return [<expression>]

Saída de um método
 throw

Manipulação de exceção
Comandos
Tratamento de Exceções
 As exceções constituem o mecanismo do C#
para o tratamento de condições de erro
inesperadas.
 Mais aperfeiçoadas por retornar valores de
estado:




Não podem ser ignoradas
Não precisam ser tratadas no ponto em que ocorrem
Podem ser usadas até onde valores estado não são
retornados (p.ex. atribuindo uma propriedade)
Exceções padrão são fornecidas pelo C#
Comandos
Tratamento de Exceções
 Comando try...catch...finally
 O bloco try contém código que pode causar
uma exceção.
 O bloco catch trata a exceção:

Pode haver múltiplos blocos catch para tratar
diferentes tipos de exceção.
 O bloco finally contém código que sempre
será executado:

Não é permitido usar comandos de desvio (p.ex.
goto) para sair de um bloco finally.
Comandos
Tratamento de Exceções
 O comando throw gera uma exceção
 Uma exceção é representada como uma
instância de System.Exception ou classe
derivada:


Contém informações sobre a exceção
Propriedades:



Message
StackTrace
InnerException
 Você pode gerar novamente (rethrow) uma
exceção, ou tratar (catch) uma exceção e gerar
(throw) uma outra.
Comandos
Tratamento de Exceções
try {
Console.WriteLine(“Tente executar");
throw new Exception(“Gere um erro!”);
}
catch (ArgumentNullException e) {
Console.WriteLine(“Peguei um erro!");
}
catch {
Console.WriteLine(“Te peguei novamente!");
}
finally {
Console.WriteLine(“Finalmente saí, ufa!");
}
Comandos
Sincronização
 Aplicativos com múltiplas camadas precisam se
proteger contra acesso simultâneo a dados:

Devem prevenir corrupção de dados
 O comando lock (bloqueio) usa uma instância
para fornecer exclusão mútua:


Só um comando lock pode ter acesso à uma
mesma instância
Na verdade ele usa a classe
System.Threading.Monitor do .NET Framework
para fornecer exclusão mútua.
Comandos
Sincronização
public class AtualizaConta {
decimal saldo;
public void Deposito(decimal valor) {
lock (this) {
saldo += valor;
}
}
public void Saque(decimal valor) {
lock (this) {
saldo -= valor;
}
}
}
Comandos
using
 Não se trata da diretiva using, mas sim do
comando.
 O C# gerencia automaticamente o uso da
memória implementando um “coletor de lixo”
(garbage collection)

Isso elimina a maioria de problemas de administração
de memória.
 Porém, resulta em finalização não
determinística:

Não há garantia quando e se um “objeto destruidor
ou coletor de lixo” é chamado.
Comandos
using
 Os objetos que precisam ser limpos depois de
usados devem implementar a interface
System.IDisposable

Um método: Dispose()
 O comando using permite que você crie uma
instância, use-a, e então se assegure que o
método Dispose é chamado quando você não
precisar mais dela.

Dispose sempre é chamado, como se ele estivesse
em um bloco finally.
 Não confunda com a diretiva using.
Comandos
using
public class MeuRecurso : IDisposable {
public void MeuRecurso() {
// Aquisição do recurso
}
public void Dispose() {
// Descarte do recurso
}
public void FaçaAlgo() {
...
}
using (MeuRecurso r = new MeuRecurso()) {
}
r.FaçaAlgo();
}
// r.Dispose() é chamado
Comandos
checked e unchecked
 Os comandos checked e unchecked permitem que
você controle a verificação de overflow em operações
aritméticas e conversões.


checked força a verificação de overflow
unchecked força a não verificação de overflow
 Você pode usar ambos como bloco de instruções ou
como uma expressão.
 O padrão é unchecked
 Use a opção /checked do compilador para fazer
checked o padrão.
Comandos
Entrada e Saída Básicas
 Aplicativos de console (janela DOS):


System.Console.WriteLine();
System.Console.ReadLine();
 Aplicativos Windows:

System.Windows.Forms.MessageBox.Show();
string v1 = “Algum dado”;
MeuObjeto v2 = new AlgumObjeto();
Console.WriteLine(“O primeiro é {0}, o segundo é
{1}”, v1, v2);
Operadores
Introdução
 O C# fornece um conjunto fixo de operadores,
cujo significado é definido para os tipos
predefinidos.
 Alguns operadores podem ser sobrecarregados
(por exemplo +)
 A tabela a seguir resume os operadores do C#
por categoria:


As categorias estão em ordem de precedência
decrescente
Os operadores em cada categoria têm a mesma
precedência
Operadores
Precedência
Categoria
Primário
Operadores
Agrupamento: (x)
Acesso a membros: x.y
Chamada de métodos: f(x)
Indexação: a[x]
Incremento posterior: x++
Decremento posterior: x—
Chamada a construtor: new
Recuperação de tipo: typeof
Liga verificação aritmética: checked
Desliga verificação aritmética: unchecked
Operadores
Precedência
Categoria
Unário
Multiplicativo
Operadores
Valor positivo de: +
Valor negativo de: Negação: !
Complemento Bitwise: ~
Pré-incremento: ++x
Pré-decremento: --x
Verifica tipo: (T)x
Multiplicação: *
Divisão: /
Resto da divisão: %
Operadores
Precedência
Categoria
Aditivo
Operadores
Adição: +
Subtração: -
Shift
Shift bits para esquerda: <<
Shift bits para a direita: >>
Relacional
Menor que: <
Maior que: >
Menor ou igual a: <=
Maior ou igual a: >=
Compatibilidade de tipo: is
Conversão de tipo: as
Operadores
Precedência
Categoria
Igualdade
Operadores
Igual: ==
Diferente: !=
Bitwise AND
&
Bitwise XOR
^
Bitwise OR
|
Lógico AND
&&
Lógico OR
||
Operadores
Precedência
Categoria
Ternário condicional
Atribuição
Operadores
?:
=, *=, /=, %=, +=, -=, <<=, >>=,
&=, ^=, |=
Operadores
Associatividade
 Operadores de atribuição e ternários
condicionais são associativos à direita:


As operações são executadas da direita para a
esquerda
x = y = z é avaliada como x = (y = z)
 Todos outros operadores binários são
associativos à esquerda:


As operações são executadas da esquerda para a
direita
x + y + z é avaliada como (x + y) + z
 Use parênteses para controlar a ordem
Usando o Visual Studio.NET
 Tipos de projetos:







Aplicativo de Console (janela DOS)
Aplicativo Windows
Aplicativo Web
Web Service
Windows Service
Biblioteca de Classes
...
Usando o Visual Studio.NET
 Janelas de trabalho:








Solution Explorer: componentes da solução
Class View: classes em uso
Properties: propriedades de objetos
Output: saídas do compilador
Task List: lista de tarefas a executar
Object Browser: navegação por objetos
Server Explorer: acesso a servidores conectados
Toolbox: componentes e ferramentas
Usando o Visual Studio.NET
 Construindo: compilando o aplicativo
 Depurando: debugando erros

Pontos de parada (break points)
 Referências: referenciando componentes
 Salvando: gravando a aplicação
Usando o Visual Studio.NET
 Demonstração: O Visual Studio.NET
Referências










http://msdn.microsoft.com
http://windows.oreilly.com/news/hejlsberg_0800.html
http://www.csharphelp.com/
http://www.csharp-station.com/
http://www.csharpindex.com/
http://msdn.microsoft.com/msdnmag/issues/0900/csharp/cs
harp.asp
http://www.hitmill.com/programming/dotNET/csharp.html
http://www.c-sharpcorner.com/
http://msdn.microsoft.com/library/default.asp?URL=/libr
ary/dotnet/csspec/vclrfcsharpspec_Start.htm
Livro:

Beginning C# Programado, Karli Watson et all, Makron Books
– Pearson Education do Brasil, São Paulo - 2002