Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas

Asp.NET e C#, Notas de estudo de Informática

Material de estudo bacana para voçês...

Tipologia: Notas de estudo

Antes de 2010

Compartilhado em 21/09/2009

ricardo-luiz-13
ricardo-luiz-13 🇧🇷

1 documento

1 / 50

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
Como Programar com
ASP.NET e C#
Alfredo Lotar
Novatec
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26
pf27
pf28
pf29
pf2a
pf2b
pf2c
pf2d
pf2e
pf2f
pf30
pf31
pf32

Pré-visualização parcial do texto

Baixe Asp.NET e C# e outras Notas de estudo em PDF para Informática, somente na Docsity!

Como Programar com

ASP.NET e C#

Alfredo Lotar

Novatec

capítulo 1

Introdução ao C# e .NET Framework

.NET Framework é um componente integrado ao Windows que suporta a execução e

o desenvolvimento de uma nova geração de aplicações e XML web services. Segundo a

documentação, o .NET Framework foi projetado com os seguintes objetivos:

  • Prover um ambiente consistente de programação orientado a objetos de modo que

o código do objeto é armazenado e executado localmente, mas pode ser também armazenado na internet e executado remotamente.

  • Prover um ambiente de execução de código que minimiza o desenvolvimento de

software e conflitos de versão.

  • Prover um ambiente de execução de código que promove execução segura de código,

inclusive código criado por fontes desconhecidas.

  • Prover um ambiente de execução de código que elimine os problemas de desempenho

gerados por linguagens de script ou ambientes interpretados.

  • Aproveitar o conhecimento do programador em diferentes tipos de aplicações, como

aplicações Windows ou web.

  • Construir toda a comunicação em padrões reconhecidos pela indústria para que o

.NET Framework possa se integrar com qualquer tipo de código.

O .NET Framework tem dois componentes principais: o Common Language Runtime

  • CLR e o .NET Framework class library, que inclui o ADO.NET, ASP.NET e o Windows

Forms.

1.1 Common Language Runtime – CLR

É o mecanismo responsável pela execução das aplicações .NET Framework. O C#

suporta CLR, assim como outras linguagens de programação da Microsoft. O código

gerado pelo compilador para o suporte CLR chamamos de código gerenciado. O

Common Language Runtime – CLR (linguagem comum em tempo de execução) é o

26 Como Programar com ASP.NET e C#

linguagem preferida e, no final, o projeto é integrado como se tivesse sido criado em

uma única linguagem.

A integração entre as linguagens facilita a vida de empresas e programadores que

adquirem ou vendem componentes. A linguagem em que o componente foi desenvol-

vido é irrelevante. A única preocupação que teremos é que tenha sido desenvolvido

numa linguagem que suporte CLR. Pelo que tenho observado em web sites de empresas

desenvolvedoras de componentes, C# é a linguagem preferida para desenvolvimento de

componentes. Em alguns web sites podemos encontrar a seguinte frase: “Desenvolvido

100% em código gerenciado C#”.

1.4 Linguagem intermediária – MSIL

Quando compilamos o código gerenciado, geramos Microsoft Intermediate Language

  • MSIL, ou simplesmente IL, o qual é independente de CPU e pode ser convertido

para código nativo. MSIL inclui instruções para carregar, armazenar, inicializar e exe-

cutar métodos, assim como instruções para operações aritméticas e lógicas, controle

de fluxo etc.

O código contido no MSIL não pode ser executado diretamente; antes de executá-lo, é

preciso convertê-lo para instruções que possam ser interpretadas pela CPU. A conversão

é realizada por um compilador just-in-time (JIT ou JITter).

MSIL é independente de plataforma, assim só precisamos de um compilador para con-

verter código MSIL em código nativo na máquina-alvo. Além disso, os metadados, que

representam informações utilizadas pelo CLR, são colocados em um arquivo chamado

Portable Executable – PE, que pode ter a extensão DLL ou EXE.

1.5 Compilando MSIL para código nativo

Antes de executar o MSIL, é preciso utilizar o .NET Framework just-in-time (JIT) para

convertê-lo para código nativo. Assim, geramos código específico para a arquitetura

na qual roda o compilador JIT. Seguindo este raciocínio, podemos desenvolver uma

aplicação e convertê-la para várias plataformas. Para isso, precisamos apenas conver-

ter o MSIL para código nativo com um compilador JIT, específico para a plataforma

desejada.

Cada sistema operacional pode ter seu compilador JIT. Claro que chamadas específi-

cas a API do Windows não funcionarão em aplicações que estejam rodando em outro

sistema operacional. Isso significa que devemos conhecer e testar muito bem uma

aplicação, antes de disponibilizá-la para múltiplas plataformas.

Em uma aplicação comercial grande, geralmente usamos um número limitado de fun-

ções. Assim sendo, algumas partes do código dessa aplicação podem não ser executadas.

Capítulo 1 • Introdução ao C# e .NET Framework 27

Como a conversão do MSIL para código nativo acarreta consumo de tempo e memória,

ela é realizada somente na primeira vez em que o código é executado. Por exemplo, se

o nosso programa compila um determinado método, haverá compilação somente na

primeira vez em que o método for executado. As chamadas seguintes utilizarão código

nativo. O MSIL convertido é usado durante a execução e armazenado para que esteja

acessível para chamadas subseqüentes.

Imagine, por exemplo, que você tenha uma classe com cinco métodos; quando você

chamar o primeiro método, somente este será compilado, e, quando precisar de outro

método, este também será compilado. Chegará um momento em que todo o MSIL

estará em código nativo.

1.6 Assemblies

Assemblies são a parte fundamental da programação com .NET Framework. Um

assembly contém o código que o CLR executa. O código MSIL dentro de um arquivo

portable executable – PE não será executado se não tiver um assembly manifest as-

sociado, e cada assembly deve ter somente um ponto de entrada, exemplo: DllMain,

WinMain ou Main.

Um assembly pode ser estático ou dinâmico. Assemblies estáticos podem incluir vários

tipos (interfaces e classes) do .NET Framework, como também recursos para assemblies

(bitmaps, arquivos jpeg etc.). Assemblies estáticos são armazenados no disco rígido

com um arquivo portable executable. O .NET Framework cria assemblies dinâmicos

que são executados diretamente da memória e não precisam ser armazenados em disco.

Podemos salvar em disco assemblies dinâmicos após sua execução.

Um assembly pode ser criado usando o Visual Studio ou outras ferramentas disponi-

bilizadas pelo .NET Framework SDK. Assemblies dinâmicos podem ser criados com

as classes da namespace System.Reflection.Emit.

1.6.1 Assemblies – benefícios

Assemblies foram projetados para simplificar o desenvolvimento de aplicações e resolver

problemas ocorridos pelo conflito de versões causado pela instalação de uma mesma

DLL de versão diferente da usada pela aplicação atual. O conflito entre as DLLs é um

problema antigo do Windows e não ocorre com o .NET Framework, pois cada apli-

cação tem suas próprias DLLs. Quando instalamos uma aplicação .NET, os arquivos

PE (DLL e EXE) ficam no mesmo diretório da aplicação, assim podemos ter diferentes

versões da mesma DLL no computador.

Capítulo 1 • Introdução ao C# e .NET Framework 29

Figura 1.1 – Tipos de assemblies.

1.9 Garbage collector – coletor de lixo

É um mecanismo que descarta, de forma automática, os objetos que não são mais

utilizados por uma aplicação. Isso deixa o programador mais tranqüilo, pois não há

preocupação com o gerenciamento de memória da aplicação. O CLR detecta quando

o programa não está mais usando um objeto e o recicla automaticamente.

1.10 C# – a linguagem de programação

C# (lembrando que se lê C Sharp) é uma linguagem de programação simples, mas

poderosa, e ao mesmo, tempo ideal para desenvolver aplicações web com ASP.NET. É

uma evolução do C e C++. Além de utilizar muitas características do C++, como, por

exemplo, declarações, expressões e operadores, o C# possui um mecanismo chamado

Garbage collector (Coletor de Lixo) que gerencia de, forma automática, a memória uti-

lizada pelas aplicações e facilita o desenvolvimento de aplicações web e de aplicações

para desktop.

O C# é uma linguagem orientada a objetos com a qual podemos criar classes que

podem ser utilizadas por outras linguagens como, por exemplo, o Visual Basic. Uma

característica importante é que ainda é possível utilizar os componentes COM, facili-

tando assim uma rápida migração para um ambiente de desenvolvimento de alto nível

sem precisar reescrever todas as aplicações que você possui.

A sintaxe utilizada pelo C# é relativamente fácil, o que diminui o tempo de aprendizado.

Depois que você entender como ela funciona, não terá mais motivos para utilizar outra lin-

guagem complicada, pois ela possui o poder do C++ e é simples como o Visual Basic.

Por ser uma linguagem orientada a objeto, existe a capacidade de uma classe herdar certas

características ou métodos de outras classes, sejam elas escritas em C# ou em VB.

Todos os programas desenvolvidos devem ser compilados, gerando um arquivo com a

extensão DLL ou EXE. Isso torna a execução dos programas mais rápida se compara-

30 Como Programar com ASP.NET e C#

dos com as linguagens de script (VBScript, JavaScript) que atualmente utilizamos na

internet.

Nosso primeiro programa C# é extremamente simples. O programa deve exibir na

tela “Olá mundo”.

// Nosso primeiro programa C# /* programa Olá mundo para compilar utilize csc OlaMundo.cs */

namespace OlaMundo { class Ola { static void Main() { System.Console.WriteLine(“Olá Mundo!”); } } }

Observe o que significa cada linha do programa anterior.

1.10.1 Comentários

Usamos comentários para descrever partes complexas de código, a fim de facilitar a

manutenção de quem elaborou o software e de terceiros. Comentários não são inter-

pretados pelo compilador C#. Podemos definir como um comentário: textos, caracteres

especiais, trechos de código, números etc.

O C# nos permite definir comentários de duas maneiras: usando barras duplas (//)

ou os caracteres /* e */.

Barras duplas (//) convertem o restante da linha em comentários:

// Nosso primeiro programa C#

Os caracteres /* e */ definem blocos de texto como comentários. Exemplo:

/*Este é meu primeiro contato com C#. Espero que aprenda rápido está nova linguagem de programação. Obrigado! */

1.10.2 Método Main

Um programa C# deve conter um método Main, que controla o início e o fim. Nele você

cria objetos e executa outros métodos. Um método Main pode não retornar valores.

static void Main() { // ... }

ou retornar um valor inteiro (int):

32 Como Programar com ASP.NET e C#

  1. Digite o código do programa OlaMundo e salve no disco c:\livro\capitulo1\OlaMundo.cs.

Uma dica: crie um diretório livro, e, em seguida, um subdiretório para cada capítulo do livro. Isso facilitará a localização e a execução dos exemplos deste livro.

  1. Em seguida, utilize o Visual Studio Command Prompt: Vá ao menu Iniciar >> Programas

>> Microsoft .NET Framework SDK v2.0 >> SDK Command Prompt. Veja a Figura 1.2:

Figura 1.2 – SDK Command Prompt.

  1. Mude o diretório atual para c:\livro\capitulo1.
  2. Digite csc OlaMundo.cs.

Neste momento, você está convertendo o código C# em linguagem intermediária (MSIL)

e gerando um arquivo Portable Executable – PE do tipo .exe, conforme a Figura 1.3:

Figura 1.3 – Compilando o programa OlaMundo.

Se tudo estiver correto e não houver nenhum erro de sintaxe, aparecerá apenas uma

mensagem contendo a versão do compilador C# e informações sobre copyright. Se

houver algum erro, será retornada uma mensagem informando a linha onde está o erro,

como pode ser visto na Figura 1.4.

Figura 1.4 – Mensagem de erro do C#.

Capítulo 1 • Introdução ao C# e .NET Framework 33

  1. Execute o programa digitando OlaMundo. O programa em execução pode ser visto na

Figura 1.5.

Figura 1.5 – Programa executado com sucesso.

O exemplo de compilação que vimos anteriormente é a forma mais básica que existe,

pois não especificamos o local, nem o nome do arquivo executável que estamos gerando,

cujo nome pode ser definido como no exemplo que segue:

csc /out:c:\saida.exe OlaMundo.cs

Se você quiser ver as opções de compilação que podem ser utilizadas em C#, digite

apenas csc /? na linha de comando, conforme mostra a Figura 1.6:

Figura 1.6 – Parâmetros do comando csc.

Para facilitar a explicação de um bloco ou linha de código, não inserimos junto com o có-

digo uma classe e um método Main, ou seja, o código não está pronto para execução.

Algumas linhas de código podem aparecer em linha única:

Console.WriteLine(i.ToString());

Ou em bloco:

for (int i = 10; i >= 1; i--) { Console.WriteLine(i.ToString()); }

Para executar esse código, você precisa criar uma classe e um método Main e compilá-lo.

Capítulo 1 • Introdução ao C# e .NET Framework 35

Ao nomear uma variável devemos observar as seguintes restrições:

  • O nome deve começar com uma letra ou _.
  • Não são permitidos espaços, pontos ou outros caracteres de pontuação, mas podemos

usar números.

  • O nome não pode ser uma palavra reservada do C#. Exemplo: if, this, while etc.
  • O nome deve ser único dentro do contexto atual.

A sintaxe utilizada para declarar uma variável é:

Tipo nome;

Exemplo:

string nome; int idade=50;

Os tipos de dados definem a quantidade de memória que será reservada para a vari-

ável.

As variáveis devem ser nomeadas levando-se em conta as tarefas que descrevem, além

disso, os nomes devem ser curtos para que possam ser facilmente digitados.

1.10.8 Tipos de dados

Como C# é uma linguagem fortemente tipada (strongly typed). Todas as variáveis e

objetos devem ter um tipo declarado.

Os tipos de dados se dividem em value types e reference types.

Todos os value types são derivados de System.ValueType, enquanto os reference types são

derivados de System.Object.

Variáveis baseadas em tipos de valor (value types) contêm diretamente o valor. Quando

copiamos uma variável para outra, uma cópia do valor é passado, enquanto em tipos

de referência (reference types) somente uma referência do objeto é passada.

Os values types se dividem em duas categorias principais: estruturas (structs) e enu-

merações (enum).

As estruturas – struct se dividem em tipos numéricos (tipos integrais, ponto flutuante

e decimal), bool e estruturas personalizadas criadas pelos programadores.

A seguir, na Tabela 1.1, temos os tipos integrais com seu tamanho e a faixa de valores

que podem conter:

36 Como Programar com ASP.NET e C#

Tabela 1.1 – Tipos integrais

Tipo Intervalo Tamanho Valor padrão

sbyte -128 até 127 Inteiro de 8 bits com sinal 0

byte 0 até 255 Inteiro de 8 bits sem sinal 0

char U+0000 até U+ffff Caractere Unicode de 16 bits ‘\0’

short -32,768 até 32,767 Inteiro de 16 bits com sinal 0

ushort 0 até 65,535 Inteiro de 16 bits sem sinal 0

int -2,147,483,648 até 2,147,483,647 Inteiro de 32 bits com sinal 0

uint 0 até 4,294,967,295 Inteiro de 32 bits sem sinal 0

long -9,223,372,036,854,775,808até 9,223,372,036,854,775,807 Inteiro de 64 bits com sinal 0L

ulong 0 até 18,446,744,073,709,551,615 Inteiro de 64 bits sem sinal 0

Os tipos de ponto flutuante são: float, double, os quais diferem entre si na faixa e na

precisão. como mostra a Tabela 1.2:

Tabela 1.2 – Tipos de ponto flutuante

Tipo Intervalo aproximado Precisão Valor padrão

float ±1.5e-45 até ±3.4e38 7 digitos 0.0F

double ±5.0e-324 até ±1.7e308 15-16 digitos 0.0D

1.10.8.1 Tipo char

Representa um único caractere Unicode de 16 bits. É utilizado para representar a maioria

das linguagens no mundo. Podemos criar variáveis do tipo char e adicionar caracteres:

char letra = ’A’; char letra1 = ‘H’;

Uma variável char pode conter seqüências de escape hexadecimal (prefixo \x) ou uma

representação Unicode (prefixo \u):

char letra2 = ‘\x0072’; // Hexadecimal char letra3 = ‘\u0072’; // Unicode

Podemos transformar, de forma explicita, um integral num char ou vice-versa.

char letra4 = (char)72; // corresponde a letra H int numero = (int)’B’; // inteiro 66

Combinações de caracteres que consistem de uma barra invertida () seguida de uma

letra ou combinação de dígitos são chamadas de seqüência de escape. Seqüências de

escape são usadas em situações específicas como: salto de linha, retorno de carro,

38 Como Programar com ASP.NET e C#

1.10.8.3 Tipo bool

Representa um valor verdadeiro ou falso. É usado com variáveis ou métodos que retor-

nam o valor true ou false. O valor-padrão do tipo bool é false.

bool x = true; bool b = false;

Os tipos usados pelo C# podem ser manipulados por struct e classes (object e string)

do .NET Framework.

Tipo C# .NET Framework

bool System.Boolean byte System.Byte sbyte System.Sbyte char System.Char decimal System.Decimal double System.Double float System.Single int System.Int uint System.UInt long System.Int ulong System.UInt object System.Object short System.Int ushort System.UInt string System.String

1.10.8.4 Enumerações – enum

As enumerações nos permitem criar um tipo distinto, constituído de um conjunto de

constantes nomeadas. A seguir, temos sua forma mais simples:

enum Dias {Domingo, Segunda, Terça, Quarta, Quinta, Sexta, Sábado};

Os elementos da enumeração são por padrão do tipo int. Os elementos podem ser de

qualquer tipo integral, exceto char. O primeiro elemento é zero, o segundo elemento é

1, e assim sucessivamente.

Na enumeração anterior Domingo é 0 (zero), Segunda é 1, Terça é 2 etc.

Podemos também atribuir valores arbitrários a cada elemento:

enum Dias {Domingo = 10, Segunda = 25, Terça = 48, Quarta = 8, Quinta, Sexta, Sábado};

Os elementos aos quais não atribuímos valores arbitrários são incrementados a partir

do último elemento com valor.

Domingo é 10, Segunda é 25, Terça é 48, Quarta é 8, Quinta é 9, Sexta é 10, Sábado é 11.

Capítulo 1 • Introdução ao C# e .NET Framework 39

Um tipo integral diferente de int pode ser definido:

enum Dias:short {Domingo, Segunda, Terça, Quarta, Quinta, Sexta, Sábado};

Para acessar o valor de cada elemento, é necessário converter, de forma explícita, cada

elemento da enumeração para int.

int x = (int) Dias.Domingo; int y = (int) Dias.Sexta; Console.WriteLine(x); Console.WriteLine(y);

O valor retornado é:

0 5

Para acessar o valor de vários elementos ao mesmo tempo, temos antes que preparar a enu-

meração. O atributo System.FlagsAttribute deve ser usado na declaração da enumeração:

[Flags] public enum Dias { Segunda = 0x01, Quarta = 0x02};

O exemplo completo que segue retorna Segunda, Sexta, Sábado.

// Arquivo de exemplo: enum.cs // Para compilar use: csc enum.cs using System; public class FlagEnum { [Flags] public enum Dias { Segunda = 0x01, Quarta = 0x02, Sexta = 0x04, Sábado = 0x08, } static void Main() { Dias d = Dias.Sábado | Dias.Segunda | Dias.Sexta; Console.WriteLine(d); } }

1.10.8.5 Tipos de referência – reference types

Nas variáveis de tipos de referência (reference types), somente uma referência do ob-

jeto é passada. A seguir temos os tipos de referências: class, interface, delegate, object,

string e Array.

1.10.8.5.1 Tipo object

Todos os tipos são herdados direta ou indiretamente da classe Object. Assim é possível

converter qualquer tipo para object. O ato de converter um variável value type para object

Capítulo 1 • Introdução ao C# e .NET Framework 41

todas as strings podem ser convertidas para valores numéricos. Veja o caso da string

“Estou escrevendo”. É impossível convertê-la, pois é uma frase, bem diferente de “54”,

que se transforma após a conversão no inteiro 54.

Você pode estar se questionando como saberá se pode converter determinado valor

para outro sem causar erros. Alguns tipos são convertidos automaticamente se o valor

que receber a conversão puder conter todos os valores da expressão. A tabela a seguir

nos mostra as conversões que são realizadas automaticamente:

De Para

sbyte short, int, long, float, double, ou decimal

byte short, ushort, int, uint, long, ulong, float, double, ou decimal

short int, long, float, double, ou decimal

ushort int, uint, long, ulong, float, double, ou decimal

int long, float, double, ou decimal

uint long, ulong, float, double, ou decimal

long float, double, ou decimal

ulong float, double, ou decimal

char ushort, int, uint, long, ulong, float, double, ou decimal

float double

No C#, não estamos limitados apenas às conversões automáticas; podemos também

forçar uma conversão. Veja a seguir:

int a = Int32.Parse(Console.ReadLine());

Note que, convertemos o valor inserido no método ReadLine para um tipo int32.

A seguir, temos as conversões explícitas possíveis:

De Para

sbyte byte, ushort, uint, ulong, ou char

byte sbyte e char

short sbyte, byte, ushort, uint, ulong, ou char

ushort sbyte, byte, short, ou char

int sbyte, byte, short, ushort, uint, ulong, ou char

uint sbyte, byte, short, ushort, int, ou char

long sbyte, byte, short, ushort, int, uint, ulong, ou char

ulong sbyte, byte, short, ushort, int, uint, long, ou char

char sbyte, byte, ou short

float sbyte, byte, short, ushort, int, uint, long, ulong, char, ou decimal

double sbyte, byte, short, ushort, int, uint, long, ulong, char, float, ou decimal

decimal sbyte, byte, short, ushort, int, uint, long, ulong, char, float, ou double

Às vezes, quando fazemos uma conversão explícita, ocorrem certos erros, pois, em

situações normais, é impossível converter, por exemplo, um tipo double para byte sem

haver perda de dados.

42 Como Programar com ASP.NET e C#

Podemos controlar se houve ou não algum erro por overflow (valor muito alto) utili-

zando as instruções checked e unchecked.

A seguir, veremos dois exemplos: um com a instrução unchecked e outro com a instrução

checked.

// Arquivo de exemplo: unchecked.cs // Para compilar utilize: csc unchecked.cs using System; public class unchecked1 { public static void Main() { int a; short b; a = 35000; unchecked { b = (short) a; Console.Write(b); } } }

Nesse exemplo, convertemos um valor (35000) de inteiro para short. O valor retornado é:

Agora, refaremos o exemplo anterior utilizando a instrução checked:

// Arquivo de exemplo: checked.cs // Para compilar utilize: csc checked.cs using System; public class checked1 { public static void Main() { int a; short b; a = 35000; checked { b = (short) a; Console.Write(b); } } }

Nenhum valor é retornado, e sim uma mensagem. Uma forma bem mais prática de se

fazer conversões é utilizar os métodos da classe Convert.

Método Descrição

ToBoolean Converte uma string para um valor booleano.

ToByte Converte para o tipo byte.

ToChar Converte para o tipo char.

ToDateTime Converte para o tipo data e hora.

ToDecimal Converte para o tipo decimal.

ToDouble Converte para o tipo double.