Escolar Documentos
Profissional Documentos
Cultura Documentos
CURSO DE PROGRAMAÇÃO EM C#
MÓDULO 1
Aluno: ______________________
1
Curso de programação em C# Mega News Informática - Módulo 1
2
Curso de programação em C# Mega News Informática - Módulo 1
O Common Language Runtime é o ambiente de execução. É usado por qualquer aplicação .NET independente da
linguagem em que foi desenvolvida. É ele quem faz a limpeza da memória através do Garbage Collector.
CTS
O Common Type System é parte integrante da CLR e possui todas as definições dos tipos .NET e seus respectivos
métodos. Esses tipos serão usados por qualquer linguagem .NET. Como já foi dito: todos os tipos são objetos
derivados da classe Object.
CLS
A Common Language Specification é a parte da CTS responsável pela definição de como as linguagens .NET devem
ser interpretadas pelo compilador. Ela assegura a execução de todo o código gerado nas linguagens compatíveis
com a plataforma.
Como foi mostrado, há muito proveito em se desenvolver aplicações para um ambiente gerenciado, multi-linguagem
e multi-plataforma como o .NET.
A LINGUAGEM C#
C# (CSharp) é uma linguagem de programação orientada a objetos criada pela Microsoft, faz parte da sua plataforma
.Net. A companhia baseou C# na linguagem C++ e Java.
História
A linguagem C# foi criada junto com a arquitetura .NET. Embora existam várias outras linguagens que suportam essa
tecnologia (como VB.NET, C++, J#), C# é considerada a linguagem símbolo do .NET pelas seguintes razões:
* Foi criada praticamente do zero para funcionar na nova plataforma, sem preocupações de compatibilidade com
código de legado.
* O compilador C# foi o primeiro a ser desenvolvido.
* A maior parte das classes do .NET Framework foram desenvolvidas em C#.
A criação da linguagem, embora tenha sido feita por vários desenvolvedores, é atribuída principalmente a
Anders_Hejlsberg, hoje um Distinguished Engineer na Microsoft. Anders Hejlsberg era desenvolvedor de
compiladores na Borland, e entre suas criações mais conhecidas estão o Turbo Pascal e o Delphi.
3
Curso de programação em C# Mega News Informática - Módulo 1
OPERADORES EM C#
1) Operador de Atribuição – O símbolo igual (=) representa a atribuição de um valor à uma variável,
onde a variável e o valor atribuído devem obrigatoriamente ser de tipos compatíveis, ou seja, uma
variável do tipo int por exemplo não pode receber um valor do tipo string
4
Curso de programação em C# Mega News Informática - Módulo 1
Assim, em um teste lógico usando o operador && (AND), o resultado somente será verdadeiro (true) se
todas as expressões lógicas forem avaliadas como verdadeiras.
Já, se o operador usado for o || (OR), basta que apenas uma das expressões lógicas seja verdadeira para
que o resultado também seja verdadeiro.
Completando, o operador lógico ! (NOT) é usado para gerar uma negação. Desta forma, é invertida toda a
lógica da expressão.
5
Curso de programação em C# Mega News Informática - Módulo 1
TIPOS DE DADOS EM C#
C# é uma linguagem fortemente tipada, portanto cada variável e objeto devem ter um tipo declarado. Pode ser
um tipo como, por exemplo, um char ou um int, ou um tipo definido pelo usuário como uma interface ou uma
classe.
Tipos Inteiros
A tabela a seguir mostra a precisão e o intervalo aproximado para os tipos de ponto flutuante:
Todos os tipos acima, na linguagem C# são aliases (apelidos) dos tipos sistema .NET Framework. Por exemplo,
int é um alias de System.Int32
Inicializando as variáveis
Variáveis locais em C# devem ser inicializadas antes de serem usadas. Portanto, se você declarar uma variável
local sem inicialização como abaixo:
6
Curso de programação em C# Mega News Informática - Módulo 1
Neste caso estará sendo chamado o construtor padrão da classe Int32 que atribui um valor inicial para a
variável.
Esta é a forma mais utilizada e lembre-se não é permitido usar variáveis não inicializadas em C#.
Tipo bool
7
Curso de programação em C# Mega News Informática - Módulo 1
A palavra-chave bool é um alias do System.Boolean. Ele é usado para declarar variáveis que armazenam os
valores booleanos, ou seja, true ou false:
Você também pode atribuir uma expressão avaliada como booleana a uma variável bool:
Obs: Em C++, um valor do tipo bool pode ser convertido em um valor do tipo int, em outras palavras, false é
equivalente a zero e true é equivalente a valores diferentes de zero. Já em C#, não existe conversão entre o
tipo bool e outros tipos.
Tipo Byte
A palavra-chave byte denota um tipo que armazena valores inteiros conforme indicado na tabela a seguir:
Você pode declarar e inicializar uma variável byte como neste exemplo:
Tipo char
A palavra-chave char é usada para declarar um caractere Unicode
Constantes do tipo char podem ser gravadas como caracteres literais, sequência de escape hexadecimal, ou
representação Unicode. Você também pode converter os códigos para caracteres.
Tipo decimal
8
Curso de programação em C# Mega News Informática - Módulo 1
A palavra-chave decimal denota um tipo de dados de 128 bits. Em comparação com o tipo ponto flutuante, o
tipo decimal tem uma precisão maior e um intervalo menor, que torna adequado para cálculos financeiros e
monetários.
Se você deseja um literal numérico real deve tratar como decimal, usando o sufixo m ou M, por exemplo:
Sem o sufixo m, o número é tratado como double (que é o padrão) gerando portanto um erro de compilação.
Os tipos integrais são implicitamente convertidos para decimal e o resultado é retornado como decimal.
Portanto, você pode inicializar uma variável decimal usando um literal Inteiro, sem o sufixo, da seguinte
maneira:
Não existe nenhuma conversão implícita entre tipos de ponto flutuante e o tipo decimal; portanto, um cast deve
ser usado para converter entre esses dois tipos:
A faixa aproximada deste tipo é: (mais ou menos)1.0 x 10e−28 até (mais ou menos)7.9 x 10e28 com
precisão de 28 ou 29 dígitos significantes. Em C# 2.0, o tipo decimal ocupa 12 bytes, como pode ser observado
no trecho de código abaixo:
Console.WriteLine("O tipo decimal ocupa " + sizeof(decimal) +
" bytes");
É preciso ter muito cuidado ao atribuir um literal de ponto-flutuante à uma variável do tipo decimal. Veja:
decimal valor = 34.50;
Este trecho de código não compila. Veja o erro reportado:
Literal of type double cannot be implicitly converted
to type 'decimal'; use an 'M' suffix to create a
literal of this type
Esta mensagem nos diz que não é possível converter implicitamente um tipo double para um tipo decimal. Para
solucionar isso, basta usar a letra "M" ou "m" após o valor literal. Veja:
decimal valor = 34.50m;
Para finalizar, se estivermos atribuindo um literal inteiro à uma variável do tipo decimal, o uso do "M" ou "m" é
dispensado. O trecho de código abaixo compila sem quaisquer problemas:
decimal valor = 34;
Tipo double
Palavra-chave double denota um tipo simples que armazena valores de ponto flutuante de 64 bits. Por padrão,
um literal numérico real no lado direito do operador de atribuição é tratada como double:
9
Curso de programação em C# Mega News Informática - Módulo 1
Tipo enum
Palavra-chave enum é usada para declarar uma enumeração, um tipo distinto, que consiste um conjunto de
constantes nomeadas. Cada tipo de enumeração tem um tipo base, que pode ser qualquer tipo integral exceto
char.
Exemplo:
Por padrão, o primeiro enumerador tem o valor 0, e o valor da cada enumerador sucessivo é aumentado em 1.
Por exemplo:
Enumeradores podem ter inicializadores para substituir os valores padrão. Por exemplo:
Nessa enumeração, a sequência de elementos é forçada para iniciar a partir 1 ao invés do 0. Ou seja, nessa
enumeração, Domingo é 1, Segunda é 2 e assim por diante.
Tipo float
A palavra-chave float denota um tipo simples que armazena valores de ponto flutuante de 32 bits. Por padrão,
um literal numérico real no lado direito do operador de atribuição é tratada como double, portanto, para
inicializar uma variável FLOAT, use o sufixo f ou F, como por exemplo:
10
Curso de programação em C# Mega News Informática - Módulo 1
Se você não usar o sufixo na declaração anterior, você receberá um erro de compilação porque você está
tentando armazenar um double em uma variável tipo float.
Tipo int
A palavra-chave int denota um tipo inteiro que armazena valores de acordo com o tamanho e intervalo
mostrado na tabela de tipos inteiros. Você pode declarar e inicializar uma variável do tipo int como este
exemplo:
Tipo long
A palavra-chave long denota um tipo integral que armazena valores de acordo com o tamanho e intervalo
mostrado na tabela de tipos inteiros. Você pode declarar e inicializar uma long variável como este exemplo:
Tipo sbyte
A palavra-chave sbyte denota um tipo inteiro que armazena valores de acordo com o tamanho e intervalo
mostrado na tabela de tipos inteiros. Você pode declarar e inicializar uma sbyte variável como este exemplo:
Tipo short
Palavra-chave short denota um tipo inteiro de dados que armazena valores de acordo com o tamanho e
intervalo mostrado na tabela de tipos inteiros. Você pode declarar e inicializar uma short variável como este
exemplo:
Se o Inteiro literal não cabe em um short local de armazenamento, ocorrerá um erro de compilação.
Tipo uint
11
Curso de programação em C# Mega News Informática - Módulo 1
Palavra-chave uint denota um tipo inteiro que armazena valores de acordo com o tamanho e intervalo mostrado
na tabela de tipos inteiros. Você pode declarar e inicializar uma variável do tipo uint como este exemplo:
Tipo ulong
A palavra-chave ulong denota um tipo inteiro que armazena valores de acordo com o tamanho e intervalo
mostrado na tabela de tipos inteiros. Você pode declarar e inicializar uma ulong variável como este exemplo:
Tipo ushort
A palavra-chave ushort denota um tipo inteiro de dados que armazena valores de acordo com o tamanho e
intervalo mostrado na tabela a seguir. Você pode declarar e inicializar uma ushort variável como este exemplo:
Classe
Interface
Delegates
Object
String
Formatação numérica
Você pode formatar resultados numéricos, usando o método String.Format:
12
Curso de programação em C# Mega News Informática - Módulo 1
Boxing e Unboxing
Boxing e unboxing permitem que tipos por valor passem a serem tratados como objetos. Isso permite que o tipo
de valor possa ser armazenado na pilha de coletados pelo Garbage Collector.
Introdução à Strings no C#
Uma string (ou sequência de caracteres) é uma matriz de caracteres. Uma sequência de caracteres literal é
declarada usando aspas, como mostrado no exemplo a seguir:
Strings são imutáveis, significando que elas não podem ser alteradas uma vez que tenha sido criada. Métodos
que atuam em strings realmente retornam novas strings.
Manipulando Strings no C#
Introdução
13
Curso de programação em C# Mega News Informática - Módulo 1
O tipo string apesar de se comportar como um value type é na verdade um reference type. Apesar disso,
devemos considerar que estamos trabalhando com um value type quando estamos manipulando strings,
tendo em vista que este tipo de dado foi programado para funcionar como tal.
A classe string possui uma série de métodos estáticos e não estáticos, que são utilizamos para formatação,
concatenação, desmembramento, substring, etc. Vamos analisar alguns destes métodos da classe string.
O método Substring
O método substring é um método não estático que permite pegarmos uma porção de uma string. Para
utilizarmos o método substring, basta chamar o método a partir de uma variável string ou mesmo de uma
string literal, conforme o exemplo.
string nome = "Testando da Silva";
string sobreNome = nome.Substring(12, 5);
O método substring aceita como parâmetro a posição inicial que queremos obter e quantos caracteres devem
ser extraídos. Caso não seja informado o número de caracteres a ser extraído, a função retornará o restante
da string a partir da posição inicial informada.
O método IndexOf
O método IndexOf é utilizado para localizar uma determinada palavra dentro da string. Este método
retornará a posição da string desejada. Caso a string não seja encontrada, será retornado o valor -1.
string nome = "Testando da Silva";
int pos = nome.IndexOf("Silva");
//A partir do índice 5
int pos2 = nome.IndexOf("Silva", 5);
Conforme vimos no exemplo, é possível informar a posição inicial para busca como um parâmetro
adicional.
As funções ToUpper e ToLower permitem colocar uma string em letra minúsculas ou maiúsculas, conforme
o exemplo a seguir.
string nome = "Maurício";
nome = nome.ToUpper();
nome = nome.ToLower();
As funções startswith e endswith verificam se a string começo ou termina com uma determinada palavra ou
caracter. Estas funções retornam um valor booleano (true ou false).
string arquivo = "comctl32.dll";
if (nome.StartsWith("com"))
Console.WriteLine("Começa com COM!");
if (nome.EndsWith(".dll"))
14
Curso de programação em C# Mega News Informática - Módulo 1
As funções de Trim servem para remover espaços em branco das strings. A função TrimStart remove os
espaços em branco do início da string, já a função TrimEnd remove os espaços em branco do final da string.
A função Trim remove os espaços em branco do inicio e do fim da string.
string nome = " MAURICIO ";
nome = nome.TrimEnd();
nome = nome.TrimStart();
nome = nome.Trim();
As funções PadLeft e PadRight servem para preencher uma string a esquerda ou a direita com um caracter
especificado. Os exemplos a seguir mostra o uso das funções PadLeft e PadRight.
string nome = " MAURICIO ";
nome = nome.TrimEnd();
nome = nome.TrimStart();
nome = nome.Trim();
A função Split serve para quebrar uma string em um array de strings de acordo com um separador. Ao
contrário da função split, a função Join concatena um array de string inserindo um separador.
string linha = "Teste, 10, 20, 10/06/2007";
A Função String.Format
A função String.Format é uma das funções mais versáteis da classe string. Esta função permite a criação de
uma string baseada em um padrão. Podemos colocar dentro do padrão da string de formatação alguns tokens
que poderam ser substituídos por variáveis passadas por parâmetro no comando format.
string teste = String.Format("Vou colocar o {0} aqui.", "parâmetro");
No exemplo acima, o padrão da string (primeiro parâmetro) contém um token {0}. Este token indica que
este valor deve ser substituido pelo segundo parâmetro passado para a função (neste caso a palavra
“parâmetro”).
sTeste = String.Format("Formatação de string com {0} parâmetro. ",
"Agora são {1}. Valor numérico: {2}", 1, Now(), 15.5);
15
Curso de programação em C# Mega News Informática - Módulo 1
No exemplo acima, temos o padrão da string com mais de um token, com números de 0 à 2. A função
também recebe 3 parâmetros adicionais que correspondem aos valores que serão substituídos na string.
Além de informarmos os tokens, podemos informar regras de formatação que serão utilizadas de acordo com
o tipo de dado passado por parâmetro, conforme o exemplo,
sTeste = String.Format("Custom Format: {0:d/M/yyy HH:mm:ss}", dtHoje);
sTeste = String.Format("Formatação do número inteiro: {0:D}.", iNumero);
sTeste = String.Format("Formatação do número inteiro: {0:D4}.", iNumero);
A classe StringBuilder~
Apesar da versatilidade da classe string, operações com string podem consumir muitos recursos e causar
perda de desempenho. Isto ocorre porque a cada operação o framework cria um novo buffer para a string
resultante da operação, ao invés de aproveitar o buffer que está sendo utilizado. Isto é mais aparente em
operações de concatenação.
Para não criar este tipo de problema, podemos utilizar a classe StringBuilder, do namespace System.Text.
Esta classe permite a criação de strings aproveitando o buffer utilizado, o que torna o código mais eficiente.
No exemplo a seguir temos um trecho de código com uma operação feita de forma ineficiente e outra mais
eficiente usando o stringBuilder, veja a diferença.
// Codigo ineficiente
string sql;
sql = "SELECT * FROM Products";
sql += " WHERE CategoryId=1 AND";
sql += " AND UnitPrice>10";
// Codigo Eficiente
StringBuilder sb =
new StringBuilder();
sql = sb.ToString();
Você pode criar uma Nova instância de da StringBuilderclasse por inicializando a variável com um dos métodos construtor
sobrecarregado, conforme ilustrado no exemplo a seguir.
16
Curso de programação em C# Mega News Informática - Módulo 1
Embora o seja um objeto dinâmico que lhe permite expandir o número de caracteres da cadeia de caracteres que ele
encapsula, você pode especificar um valor para o número máximo de caracteres que ele pode armazenar. Esse valor
é chamado a capacidade do objeto e não deve ser confundida com o comprimento da string que contém o atual . Por
exemplo, você pode criar uma nova instância da classe com a cadeia de caracteres "Hello", que tem um tamanho de
5, e você pode especificar que o objeto tem uma capacidade máxima de 25. Quando você modifica o , ele não
realoca o seu tamanho até que a capacidade seja atingida. Quando isso ocorre, o novo espaço é alocado
automaticamente e a capacidade é dobrada. Você pode especificar a capacidade da classe usando um dos
construtores sobrecarregados. O exemplo a seguir especifica que o objeto MyStringBuilder pode ser expandido para
um máximo de 25 espaços.
Além disso, você pode usar a propriedade de leitura/escrita Capacity para definir o comprimento máximo de seu
objeto. O exemplo a seguir usa a propriedade Capacity para definir o comprimento máximo do objeto.
MyStringBuilder.Capacity = 25;
O método EnsureCapacity pode ser usado para verificar a capacidade do atual StringBuilder. Se a capacidade for
maior do que o valor passado, nenhuma alteração é feita; no entanto, se a capacidade for menor do que o valor
passado, a capacidade atual é alterada para coincidir com o valor passado.
A propriedade Length também pode ser exibida ou definida. Se você definir a propriedade Length para um valor que
é maior do que a propriedade Capacity, a propriedade Capacity é automaticamente alterada para o mesmo valor
que a propriedade Length. Configurar a propriedade Length com um valor que seja menor que o comprimento da
sequência de caracteres dentro do StringBuilder atual diminuirá a sequência de caracteres.
A tabela a seguir lista os métodos que podem ser usados para modificar o conteúdo de um StringBuilder.
StringBuilder.AppendFormat Substitui um especificador de formato passado em uma sequência de caracteres com texto formatado.
17
Curso de programação em C# Mega News Informática - Módulo 1
Append
O método Append pode ser usado para adicionar texto ou uma representação da seqüência de caracteres de um objeto ao final de uma
seqüência de caracteres representada pelo StringBuilder atual. O exemplo a seguir inicializa um StringBuilder com "Hello World" e,
em seguida, acrescenta algum texto ao final do objeto. Espaço é alocado automaticamente conforme necessário.
Console.WriteLine(MyStringBuilder);
AppendFormat
O método StringBuilder.AppendFormat adiciona o texto do participante do StringBuilderobjeto. Oferece suporte para o recurso
Formatando composto (para obter mais Informação, consulte Formatação Composta) chamando o IFormattableimplementação do
objeto ou objetos a ser formatado. Portanto, ele aceita as cadeias de caracteres de Formatar padrão para valores numéricos, data e hora e
enumeração, as cadeias de caracteres de Formatar Personalizada para numérico e valores de data e hora e as seqüências de caracteres de
Formatar definidas para tipos personalizados. (Para obter Informação sobre Formatando, consulte Tipos de Formatação.) Você pode
usar esse método para personalizar o Formatar das variáveis e acrescente a esses valores para um StringBuilder. O exemplo a seguir
utiliza o AppendFormatmétodo para colocar um valor Número um número inteiro é formatado sistema autônomo um valor de moeda
no participante de um StringBuilderobjeto.
Console.WriteLine(MyStringBuilder);
Insert
O Método Insert adiciona uma sequência ou um objeto para uma posição específica na atual StringBuilderobjeto. O exemplo a seguir
usa esse método para inserir uma palavra na sexta posição de um objeto StringBuilder.
MyStringBuilder.Insert(6,"Beautiful ");
Console.WriteLine(MyStringBuilder);
18
Curso de programação em C# Mega News Informática - Módulo 1
Remove
Você pode usar o método Remove de para remover um número especificado de caracteres de atual StringBuilderobjeto, começando em
um índice baseado em zero especificado. O exemplo a seguir utiliza o método Remover de para diminuir um StringBuilderobjeto.
MyStringBuilder.Remove(5,7);
Console.WriteLine(MyStringBuilder);
// Hello
Replace
O método Replace do pode ser usado para substituir caracteres dentro de StringBuilderobjeto com outro caractere
especificado. O exemplo a seguir utiliza o método Substituir do para pesquisar um StringBuilderobjeto para todas as
instâncias do ponto de exclamação (!) de caracteres e substituí-los com o caractere de ponto de interrogação (?).
Caracteres de escape
Caractere de escape é um termo usado em computação para identificar um único caractere numa cadeia de
caracteres que altera o significado de seu sucessor. Uma sequência de escape é o subconjunto de caracteres
da cadeira de caracteres formado pelo caractere de escape e o caractere com o significado alterado. Em geral,
este caractere é a barra contrária (\).
Caracteres de escape, como " " (nova linha) e " " (tabulação) pode ser incluídas em sequências. Por exemplo:
19
Curso de programação em C# Mega News Informática - Módulo 1
Se você desejar incluir uma barra dentro da string, ele deve ser precedido com outra barra invertida. Como no
exemplo:
Resultado:
20
Curso de programação em C# Mega News Informática - Módulo 1
\\ Linha invertida
\0 Unicode caractere 0
\a Alerta (caractere 7)
\uxxxx Unicode sequencia de escape para caracteres com valor expresso em hexadecimal
\xn[n][n][n] Unicode sequencia de escape para caracteres expresso em valor hexadecimal nnnn (versão do u\xxxx
comcomprimento variável)
\Uxxxxxxxx Unicode escape sequence for character with hex value xxxxxxxx (for generating surrogates)
\Uxxxxxxxx Unicode seqüência de caractere de escape expresso em hexadecimal (para geração de sub-título).
21
Curso de programação em C# Mega News Informática - Módulo 1
O símbolo @ ( Arroba )
O @ informa ao construtor da String para ignorar caracteres de escape e quebras de linha. Por exemplo:
Resultado:
Usando StringBuilder
A classe StringBuilder cria um buffer de sequência que oferece melhor desempenho se seu programa executa
uma grande quantidade de manipulação de strings. Ela também permite que você possa reatribuir caracteres
individuais, algo que o tipo string não oferece suporte. Por exemplo, o código abaixo, altera o conteúdo de uma
sequência sem criar uma nova sequência:
Matrizes
22
Curso de programação em C# Mega News Informática - Módulo 1
Uma matriz, também conhecida como array, é uma estrutura de dados que contém um número de variáveis do
mesmo tipo. As matrizes são declaradas com um tipo de dados, como o código abaixo:
Neste caso definimos a matriz com 3 elementos. Essa matriz contém os elementos de i[0] à i[2]. Obviamente
poderíamos fazer estes 2 passos em uma única instrução:
m[0] = 2;
m[1] = 4;
m[2] = 6;
Observe que o primeiro elemento é base zero. Também podemos declarar a matriz e inicializar seus valores em
uma única linha:
A classe System.Array fornece vários outros métodos e propriedades para classificação, pesquisa, e copia de
matrizes. Por exemplo:
23
Curso de programação em C# Mega News Informática - Módulo 1
Neste caso estamos obtendo a posição do valor 10 dentro do array m. O resultado será 4. Caso não
encontrasse o valor seria -1.
Matrizes multidimensionais
Matrizes podem ter mais de uma dimensão. Por exemplo, a declaração a seguir cria uma matriz bidimensional
de quatro linhas e duas colunas:
Matrizes irregulares
Uma matriz irregular é uma matriz cujos elementos são matrizes. Os elementos de uma matriz irregular podem
ser de dimensões e tamanhos diferentes. Uma matriz irregular às vezes é chamada de uma "matriz de
matrizes".
A seguir há uma declaração de uma matriz dimensional única que tenha três elementos, cada um deles é uma
matriz dimensional única de inteiros:
Antes de usar mi, seus elementos devem ser inicializados. Você pode inicializar os elementos desta forma:
Cada um dos elementos é uma matriz dimensional única de inteiros. O primeiro elemento é uma matriz de 2
inteiros, o segundo é uma matriz de 4 inteiros, e o terceiro é uma matriz de 6 inteiros.
24
Curso de programação em C# Mega News Informática - Módulo 1
Também é possível usar inicializadores para preencher os elementos da matriz com valores, caso em que você
não precisa informar o tamanho de matriz. Por exemplo:
Uma matriz irregular é uma matriz de matrizes, e, portanto seus elementos são tipos de referência e são
inicializados para null.
O método Length retorna o número de matrizes contidas na matriz irregular. Por exemplo, supondo que você
tenha declarado a matriz anterior, esta linha:
Retornará um valor de 3.
Retornará um valor de 2.
Matriz de 2 dimensões
Este exemplo cria uma matriz cujos elementos são matrizes. Cada um dos elementos de matriz tem um
tamanho diferente:
25
Curso de programação em C# Mega News Informática - Módulo 1
Exemplo em execução:
Esta instrução fornece uma maneira simples e limpa para percorrer os elementos de uma matriz. Por exemplo,
o código a seguir cria uma matriz chamada n e itera( Percorre ) através da instrução foreach:
26
Curso de programação em C# Mega News Informática - Módulo 1
27
Introdução ao IDE Visual Studio
Vamos ver um pouco do ambiente de desenvolvimento integrado (IDE) do Visual Studio e seus recursos, que é
uma coleção de ferramentas de desenvolvimento expostas por meio de uma interface de usuário comum.
Quando estamos lidando com o Visual Studio, as ferramentas são compartilhadas com outras linguagens do
.NET Framework. Dentre todos os recursos, abaixo temos um resumo de alguns deles:
Editor de códigos
O Editor de códigos é onde escreveremos os códigos, e um dos seus recursos é os trechos de códigos, onde
existe um modelo de código, que pode ser preenchido, e aumenta a velocidade de entrada de código:
Estes trechos são armazenados como arquivos XML que podem ser facilmente editados e personalizados.
Refatoração
Ferramentas de refatoração podem automaticamente reestruturar seu código fonte, por exemplo, promovendo
as variáveis locais para parâmetros ou convertendo um bloco de código em um método:
Vamos falar um pouco de refactoring ou refatoração. Para começar o que é refatoração ? Vejamos o que diz a
Wikipédia:
Refatoração (do inglês Refactoring) é o processo de modificar um sistema de software para melhorar a estrutura
interna do código sem alterar seu comportamento externo.
O uso desta técnica aprimora a concepção (design) de um software e evita a deterioração tão comum durante o
ciclo de vida de um código. Esta deterioração é geralmente causada por mudanças com objetivos de curto prazo ou
por alterações realizadas sem a clara compreensão da concepção do sistema.
Outra consequência é a melhora no entendimento do código, o que facilita a manutenção e evita a inclusão de
bugs. Esta melhora no entendimento vem da constante alteração do código com objetivo de facilitar a
comunicação de motivações, intenções e objetivos por parte do programador
Pegando um gancho na definição acima podemos entender a refatoração como sendo o processo de
reestruturação de um sistema com o objetivo de simplificar, tornar mais legível e diminuir o custo de
manutenção do código sem alterar as funcionalidades do sistema.
Usando técnicas de refatoração você pode reestruturar partes do código do seu sistema alterando sua estrutura
interna sem mudar o seu comportamento externo.
Alterar o nome de uma classe, função ou método : Permite a alteração do nome (identificador) de uma
classe, variavel, ou método. A alteração é propaganda por todo o código que realize alguma referência
ao identificador alterado.
Extrair um método : Essa operação gera um novo método a partir do código previamente selecionado
pelo programador através do editor de código-fonte integrado ao ambiente de desenvolvimento.
Alterar os parâmetros : Modifica os parâmetros de um método, refletindo a mudança em todos os código
que realizam chamada ao mesmo.
Encapsular campos : Gera os métodos get e set para os atributos de uma classe, atualizando todas as
referências aos atributos em códigos associados.
O Refactor! é uma grátis mas não possui todas as funcionalidades habilitadas . Após efetuar o download e
instalar você pode registrar o produto no site da empresa e receber um bônus com algumas funcionalidades a
mais do que a versão padrão gratuita.
Após instalar o Refactor! e o bônus podemos realizar algumas operações de refatoração no ambiente do Visual
Studio usando o Visual Basic 2005.
O suporte a refatoração para os desenvolvedores VB.NET esta disponível através do menu de contexto
acionado pelo clique do botão direito do mouse sobre o código e a medida que você trabalhar com o código o
Refactor! esta trabalhando em segundo plano. O menu de contexto é alterado de forma dinâmica de forma e
exibir somente as ações de refatoração válidas para o código selecionado. Além disso a ferramenta oferece
dicas sobre a ação de refatoração selecionada.
As principais ações de refatoração para o Visual Studio usando o Refactor!
1- O método Extract
Uma das maneiras mais simples de refatorar um método muito grande é quebrá-lo em pequenos pedaços de
métodos menores. A ação de refatoração via método Extract é invocada através da seleção de uma região de
código que você deseja mover para fora do método original.
O trecho de código a seguir faz parte de uma pequena aplicação Visual Basic 2005:
MessageBox.Show(saida)
End Sub
Podemos selecionar o trecho de código do bloco If/End If para realizar uma extração do código
para forma do método. Selecione o trecho de código, clique com o botão direito do mouse e o
menu de contexto irá surgir. Selecione a opção Refactor! e em seguida Extract Method.
O Refactor! irá exibir a dica referente a ação proposta com indicações de atuação no código.
Ao selecionar a opção - Extract Method - o Refactor! irá solicitar que você indique o local em
seu código onde você deseja inserir o novo método.
Após selecionar o local o novo método será inserido com um nome arbitrário que estará
destacado permitindo que você altere o nome sugerido.
Você pode usar este recurso para otimizar o seu código e torná-lo mais legível e mais simples de
manter.
2- Reordenando Parâmetros
Ás vezes é preciso reordenar os parâmetros de alguns métodos de suas classes. Para executar
esta refatoração usando o Refactor! escolha o método/rotina e a seguir o selecione um
parâmetro do método clicando com o botão direito do mouse após a seleção. Será apresentado
o menu de contexto, clique em Refactor! e selecione Reorder Parameters.
Para renomear um método usando o Refactor! selecione o método e acione o menu de contexto
com o botão direito do mouse. Serão apresentadas as opções, dentre elas Safe Rename;
A seguir selecione a opção Safe Raname. O Refactor! irá gerar um novo método com outro nome
tornando o método antigo obsoleto.
Note que é exibida também a opção Symbolic Rename. Esta opção renomeia o método e
atualiza todas as referências feitas a ele no código.
Para renomear uma variável local basta selecioná-la. A refatoração Rename Local irá alterar o
nome da variável e atualizar todas as referências a ela no seu código.
Com estes exemplo procurei mostrar alguns dos recursos de refatoração que podem ser usados
no VB 2005 via utilitário Refactor! . O suporte a refatoração para o C# é nativo.
A versão Pro do Refactor! permite o acesso mais funcionalidades, mas isto é assunto para outro
artigo sobre refatoração.
O importante é você perceber que mesmo com estas limitações você pode ainda usá-la para
otimizar o seu código.
-------------------------------
Comentários XML
Janelas
Na figura abaixo estão as janelas mais importantes no Visual Studio 2010 Express:
Solution Explorer
Utilize o Solution Explorer (Gerenciador de Soluções) para exibir e gerenciar arquivos de projeto e
configurações:
Toolbox
Utilize a Toolbox (Caixa de Ferramentas) para o desenvolvimento rápido de interfaces gráficas usando o mouse
para desenhar os vários objetos de um formulário:
Properties
Utilize a janela Properties (Janela de Propriedades), para configurar propriedades e eventos dos objetos da sua
interface de usuário:
Projeto no Visual Studio
Um projeto contém todos os arquivos necessários para seu aplicativo, incluindo não apenas arquivos de código
fonte, mas também arquivos de recursos como ícones, referências a arquivos externos que seu programa
depende.
Quando você cria um projeto, Visual Studio chama o compilador C# e outras ferramentas internas para criar um
conjunto executável usando os arquivos em seu projeto.
O nó Properties representa definições de configuração que se aplicam a seu projeto inteiro e são armazenados
no arquivo .csproj na sua pasta solução:
Essas configurações incluem opções de compilação, segurança, configurações de implantação e muito mais.
Designer de Projeto
Você faz modificações em seu projeto usando o Designer de Projeto, que é um conjunto de Páginas de
Propriedades que você acessa clicando com o botão direito do mouse sobre Properties, e selecionando Open:
Onde:
Assembly name: Especifica o nome do arquivo de saída que manterá o manifesto do conjunto.
Default namespace: Especifica o espaço para nome base para todos os arquivos no projeto.
Output type: Especifica o tipo do aplicativo que será criado.
Assembly Information: Através desta caixa de diálogo é possível especificar os valores dos atributos no
arquivo AssemblyInfo criado automaticamente com o projeto (veremos mais detalhes a seguir).
Startup object: Define o ponto de entrada a ser chamado quando o aplicativo carregado; geralmente isso
é definido um para o formulário principal no seu aplicativo ou para o Sub Main procedimento que deve
executado quando o aplicativo for iniciado.
Recursos: As opções a seguir permitem-lhe definir configurações gerais para o aplicativo:
Icon: Define o arquivo.icon que você deseja usar como o ícone do aplicativo.
Resource File: Para adicionar um arquivo de recurso do Win32 para o projeto.
Assembly Information
Através da caixa de diálogo Assembly Information podemos especificar os valores dos atributos no arquivo
AssemblyInfo (.exe ou .dll ) criado automaticamente com o projeto:
Onde:
File Version: Especifica um número de versão que instrui o compilador para usar uma versão específica
para o recurso de versão de arquivo Win32.
GUID: Um GUID exclusivo que identifica o conjunto. Quando você criar um projeto, Visual Studio gera uma
GUID para o conjunto.
Make assembly COM-Visible: Especifica se tipos no conjunto serão acessíveis para COM.
Estas informações ficam gravadas junto ao seu arquivo executável. Para visualizá-las, localize o teu arquivo
executável e clique com o botão direito do mouse:
E selecione a opção Propriedades:
Referências
No contexto de um projeto, uma referência simplesmente identifica um arquivo binário que seu aplicativo requer
para executar:
Normalmente, uma referência identifica um arquivo DLL como um dos arquivos de biblioteca de classe do .NET
Framework.
Se seu programa cria uma instância de uma classe que está definida em algum outro assembly, você deve
adicionar uma referência a esse arquivo em seu projeto antes de você compilar o projeto. Para adicionar uma
referência, clique em Add Reference no menu Project.
Todos os projetos C# por padrão incluem uma referência a mscorlib.dll, que contém as classes principais do
.NET Framework.
Formulários
Quando você cria um projeto Windows Forms, o Visual Studio adiciona um formulário no projeto por padrão e
chama-o Form1:
Os dois arquivos que representam o formulário são chamados Form1.cs e Form1.designer.cs.
Você escreve seu código no Form1.cs, o arquivo .designer.cs é onde o Windows Forms Designer escreve o
código que implementa todas as ações que você realizou arrastando e soltando controles da Toolbox, as
propriedades definas na janela Properties. Todos os formulários que você adicionar ao projeto tem estes dois
arquivos associados.
Você pode adicionar um novo formulário, clicando no item de menu Project, e selecionando Add Windows
Form.
Um projeto pode incluir qualquer número de arquivos .cs adicionais que pode ou não estar associado a um
Windows Form específico:
Por enquanto só temos um arquivo de código no projeto, o Program.cs que contém o ponto de entrada para o
aplicativo.
Um único arquivo .cs pode conter qualquer número de definições de classe e estrutura.
Você pode adicionar arquivos novos ou existentes ou classes no seu projeto, clicando em Add New Item ou Add
Existing Item no menu Project.
Projetando uma interface de usuário
No Visual Studio, a maneira mais rápida e conveniente de criar sua interface de usuário (UI) é fazê-la
visualmente, usando o Windows Forms Designer e o Toolbox.
Adicionando controles
No designer, você usa o mouse para arrastar, por exemplo, botões e caixas de texto, para uma superfície de
projeto que representa o formulário.
A imagem abaixo mostra uma caixa de combinação que foi arrastado da janela Toolbox para um formulário no
Windows Forms Designer:
Enquanto você trabalha visualmente, o designer converte suas ações em código fonte C# e os grava em um
arquivo de projeto chamado .Designer.cs onde é o nome que você deu para o formulário.
Quando seu aplicativo é executado, esse código fonte irá posicionar e dimensionar os elementos de UI para
que elas apareçam da mesma maneira que na superfície de projeto.
Definindo Propriedades
Os valores que você especificar na janela Properties são simplesmente os valores iniciais que serão atribuídos
a essa propriedade quando o controle é criado em tempo de execução. Em muitos casos, esses valores podem
ser acessados ou alterados programaticamente em tempo de execução simplesmente obtendo ou definindo a
propriedade na instância da classe de controle em seu aplicativo.
Obs: Quando você seleciona vários objetos, somente propriedades comuns a todos os objetos selecionados
aparecem.
Categorias: Lista todas as propriedades e valores de propriedade para o objeto selecionado, por categoria:
Você pode recolher uma categoria para reduzir o número de propriedades visíveis. Ao você expandir ou
recolher uma categoria, você verá um sinal (+) ou menos (-) para a esquerda do nome da categoria Categorias
estão listadas em ordem alfabética.
Alfabética: Classifica todas as propriedades em tempo de design e eventos para objetos selecionados em
ordem alfabética:
Propriedades: Exibe as propriedades de um objeto:
Muitos objetos também ter eventos que podem ser exibidos usando a Properties janela.
Propriedade Pages: Exibe a Property Pages caixa de diálogo ou Project Designer para o item selecionado:
Páginas de propriedades exibe um subconjunto das propriedades disponíveis na janela Properties. Use este
botão para exibir e editar propriedades relacionadas à configuração ativa do seu projeto.
Basicamente vamos configurar as propriedades Name e Text dos vários controles e do formulário, para que ele
fique assim:
Form1
Name: frmCadastro
Text: Cadastro
Botão
Name: btnIncluir
Text: Incluir
label1
Name: lblEmpresa
Text: Empresa
textBox1
Name: txtEmpresa
Text: deixar em branco
Label2
Name: lblStatus
Text: Status:
Tratamento de eventos
Programas com interfaces gráficas são principalmente direcionadas a eventos. Ou seja, eles aguardam até que
um usuário faça algo (uma ação) como inserir texto em uma caixa de texto, clicar em um botão, ou alterar uma
seleção em uma caixa de listagem.
Quando isso acontece, o controle, que é apenas uma instância de uma classe do .NET Framework, envia um
evento para seu aplicativo.
Você pode optar por manipular um evento escrevendo um método especial em seu aplicativo que será
chamado quando o evento é recebido. Usando a janela Properties para especificar que eventos deseja tratar
em seu código.
Selecione o botão no designer e clique no botão Events, o ícone de um raio, na barra de ferramentas da janela
Properties para ver os seus eventos:
Observe que apesar de você ter alterado o nome do botão, ele continua associado ao button1_Click. Para
alterar este nome, basta, nesta janela apagar este nome e dar um clique duplo no lugar onde estava o
button1_Click conforme imagem abaixo:
Criando Eventos Customizados no C# (WindowsForms)
Introdução
Necessidade comum no desenvolvimento de soluções Windows Forms é a criação de eventos
personalizados. O desenvolvedor pode utilizar este recurso para gerenciar de forma mais eficiente o
fluxo de execução do seu programa. Com eventos, podemos manter o usuário informado sobre o
processamento executado pela aplicação e manter seu usuário informado é sem dúvida nenhuma uma
boa prática. Os formulários e controles possuem eventos built-in que atendem as necessidades mais
comuns das aplicações, contudo, a possibilidade de criarmos nossos próprios eventos nos permite
melhorar a qualidade do software produzido.
Estrutura do Exemplo
O exemplo apresentado neste artigo foi elaborado sobre a seguinte estrutura:
Classe Base (frmBase.cs)
Formulário de Produtos (frmProdutos.cs)
Formulário MDI (mdiCadastro.cs)
A Classe Base implementa uma estrutura básica para operações CRUD. O aplicativo que consome esta
classe utiliza o modelo tradicional de Multiple Document Interface (MDI). Assim, o formulário MDI
implementado pela classe mdiCadastro.cs oferece as funcionalidades necessárias para manipular os
métodos e eventos dos formulários filhos. No exemplo, temos um formulário de Produtos cujo método
Salvar é invocado através da barra de ferramentas do formulário MDI. Implementamos um Evento
Customizado (AoSalvar) para exibir uma mensagem logo após o botão Salvar da barra de
ferramentas ser clicado pelo usuário.
Consumindo Eventos
O aplicativo utilizado no exemplo, consome o evento AoSalvar sempre que o usuário clica no botão
Salvar da barra de ferramentas. O código deste botão é apresentado no Quadro 2, a linha em negrito
destaca o método RaiseAposSalvar que dispara o evento imediatamente após o método
SalvarRegistro ser executado. Neste fragmento de código, o objeto frmActiveChild corresponde ao
formulário de Produtos instanciado pelo MDI.
......
case "Salvar":
if (this.ActiveMdiChild != null)
{
try
{
if (frmActiveChild.ValidarFormulario())
{
frmActiveChild.Validate();
frmActiveChild.RaiseAoSalvar();
frmActiveChild.SalvarRegistro();
frmActiveChild.RaiseAposSalvar();
frmActiveChild.Status = frmBase.FormStatus.Ocioso;
AtualizarBarraFerramentas();
frmActiveChild.DesativarControles();
frmActiveChild.Refresh();
}
}
.....
Quadro 2: Fragmento de código disparando o evento AoSalvar
Conclusão
Com este exemplo, você pode criar seus eventos personalizados e oferecer um feedback mais elegante
e eficiente para os usuários das suas aplicações Windows Forms. Existe ainda a possibilidade de
implementar eventos mais complexos incluindo informações peculiares ao evento customizado,
Criando uma Aplicação Console
Uma aplicação console é uma aplicação que roda através de uma linha de comando, no prompt do DOS,
vamos ao projeto.
1- Selecione no menu File a opção New Project e selecione o template Console Application:
Altere o nome do projeto (Name) para, por exemplo, AplicacaoConsole e clique em OK.
No início do código temos algumas referencias a namespaces (será abordado mais a frente):
Editando código
O Editor de códigos do Visual C# é um processador de texto para escrever código fonte:
Assim como o Microsoft Word fornece suporte abrangente para frases, parágrafos, e gramática, o editor de
códigos C# faz o mesmo para sintaxe C# e para o .NET Framework.
Por exemplo, o IntelliSense, baseado na documentação, vai sugerido linhas códigos à medida que você digita
no editor:
Sublinhado Ondulado
Notificações visuais de palavras incorretas, erro de sintaxe e situações de aviso conforme você digita:
Finalizando nosso exercício
Para executar o programa clique em CTRL + F5. Digite um nome na caixa de texto e clique no botão incluir:
Comentários em C#
A linha abaixo é um comentário:
Você também pode comentar um bloco de texto, colocando-o entre os caracteres /* e */, por exemplo:
O método Main()
Todo programa em C# deve conter um método chamado Main, no qual o controle de execução inicia e termina.
É nele que criamos os objetos e executa outros métodos. É um método static (estático) que reside em uma
classe ou uma estrutura.
Entrada e Saída
Programas console em C# geralmente usam os serviços de entrada / saída fornecidos pelas Bibliotecas do
.NET Framework
A instrução:
Ele exibe no console o valor do seu parâmetro seguido por uma nova linha.
Uma aplicação console é uma aplicação que roda através de uma linha de comando, no prompt do DOS, e
atualmente este tipo de aplicação é muito pouco utilizado, normalmente se utiliza aplicações Windows ou Web,
por isto vamos voltar ao nosso exemplo anterior.
Aplicação Windows
Abra o nosso projeto MeuProjeto, em File > Open Projeto:
Visibilidade da variável
No C# uma instrução deve necessariamente ser criada dentro de um método, já uma declaração de variável,
pode ser feita dentro da classe:
Observe que no código acima a declaração da variável status foi feita dentro do bloco da classe, neste caso ela
recebe o nome de variável de classe ou variável global e fica visível para toda classe.
Já variáveis ou constantes declaradas em um bloco de código só estarão disponíveis para instruções dentro do
mesmo bloco de código:
Repare no exemplo acima, que o Visual C#, acusou erro na variável status, dentro do método incluir(), pois esta
variável foi criada no método btnIncluir_Click(), e está visível apenas no mesmo, neste caso ela recebe o nome
de variável local. A variável status declarada dentro do bloco do método, não existe fora deste bloco.
Instruções
Uma instrução pode declarar variável ou constante, uma chamada local um método, criar um objeto, ou atribuir
um valor a uma variável, propriedade ou campo, como no código abaixo:
Uma série de instruções delimitadas por chaves forma um bloco de código. O corpo de método é um exemplo
de um bloco de código.
Expressões
Uma expressão é um fragmento do código que pode ser avaliado como um único valor, objeto, método, ou
espaço para nome. Pode conter um valor literal, uma invocação do método, um operador e operandos, ou um
nome simples.
Nomes simples podem ser, por exemplo, o nome de uma variável, parâmetro, método, espaço para nome ou
tipo.
Exemplo:
Expressões podem usar operadores que por sua vez usam outras expressões como parâmetros ou chamadas
de método cujos parâmetros são por sua vez outras chamadas de método, portanto, expressões podem variar
de simples a muito complexo.
Os tipos mais simples de expressões são literais e nomes simples. Um literal é um valor constante que não tem
nome. No exemplo anterior 0 é um literal.
Uma invocação (chamada) do método requer o nome do método, como no exemplo acima, incluir().