Desenvolvimento - C#
Série aprenda C# - Tipos de dados e CTS (Common Type System)
Neste segundo artigo da série aprenda C# você verá qual a cara de um programa escrito em C# e o que representa cada parte, além dos tipos básicos de dados da linguagem, o que são variáveis e constantes.
por Cleber DantasPúblico: Iniciante.
No ultimo artigo vimos uma introdução a plataforma .NET e ao C# (Csharp)
http://www.linhadecodigo.com.br/artigos.asp?id_ac=984&pag=1
Introdução
Neste segundo artigo da série aprenda C# você verá qual a cara de um programa escrito em C# e o que representa cada parte, além dos tipos básicos de dados da linguagem, o que são variáveis e constantes.
Meu primeiro programa em C#
Agora veremos como é a cara de um programa escrito em C# e explicaremos as partes que o compõem, como já é de praxe vamos ver como fica o famoso Hello World em C#, veja:
using System;
class Hello
{
public static void Main ()
{
//Emite a mensagem Hello World!!! na tela
Console.WriteLine("Hello World!!!");
}
}
No código acima vemos um programa muito simples que nos mostra uma única mensagem, porém a muito a ser explicado. Mãos a obra.
Vamos ver o que significa a seguinte linha:
using System;
A keyword ‘using’ importa o Namespace ‘System’ para nosso programa, ou seja, para que todas as classes e métodos do Namespace ‘System’ possam ser usados em nosso programa. Atente-se ao ponto e virgula(;) no final da instrução.
Depois dessa afirmação você já deve ter algumas perguntas em mente como, por exemplo:
1ª O que é um NameSpace?
2ª O que é importar um Namespace?
Vamos às respostas.
O que é um NameSpace?
De uma maneira simples um Namespace é um agrupamento lógico de funcionalidades, no artigo passado falei sobre o .NET Framework e nele temos a .NET Class Library que é um conjunto de classes integrada com o ambiente de execução – CLR. Esse conjunto de classes faz diversas coisas como, por exemplo, manipulação de arquivos, segurança e etc. Agora como que essas milhares (milhares mesmo) de classes são organizadas? A resposta é simples, são organizadas em Namespaces, por exemplo, as classes que tratam de manipulação de arquivos são dispostas dentro do Namespace ‘System.IO’, já as que trabalham com acesso a dados são organizadas dentro do Namespace ‘System.Data’ e etc. Ou seja, tudo isso é para termos uma melhor organização de nossas classes, quando quisermos trabalhar com acesso a dados já sabemos que teremos que usar as classes do Namespace ‘System.Data’ e assim por diante.
O que é importar um Namespace?
No nosso exemplo estamos utilizando o Namespace ‘System’ mais especificamente a classe ‘Console’ deste Namespace e por sua vez o método ‘WriteLine’ da classe ‘Console’ que simplesmente exibe uma mensagem na tela. Se não estivéssemos importando o Namespace ‘System’ com a keyword ‘using’ para usarmos o método ‘WriteLine’ da classe ‘Console’ teríamos que digitar o caminho completo do método nesse caso: ‘System.Console.WriteLine’, ou seja, fazemos a importação para facilitar a nossa vida, assim uma vez importado o Namespace podemos usar as classes do mesmo sem digitar o caminho completo o que economiza digitação.
Declaração da classe
class Hello
{
...
}
O código acima é onde definimos nossa classe, a lógica de um programa em C# deve sempre estar dentro de uma definição de tipo nesse caso uma classe. Veja que a definição de nossa classe começa na abertura da chave({) e termina em seu fechamento(}).
Declaração do método Main
public static void Main ()
{
…
}
Dentro da nossa definição de classe temos um método chamado ‘Main’ todo programa em C# tem um método Main é o ponto de partida do programa, ou seja, a execução do aplicativo se inicia aqui.
O método também inicia com a abertura de chave ({) e termina com seu fechamento (})
Comentários
//Emite a mensagem Hello World!!! na tela
Aqui temos um comentário, quando deixamos um comentário em nosso programa ele simplesmente é ignorado pelo compilador assim não causando nenhum erro. Em C# temos algumas maneiras de fazermos comentários veja.
Comentário em uma única linha:
//Única linha, usa-se duas barras.
Comentário com múltiplas linhas:
/* Comentário com mais
de uma linha, usamos uma barra e um asterisco no começo e no final um asterisco e uma barra */
OBS: É uma boa pratica sempre deixar comentários em nossos códigos, assim podemos lembrar no futuro o que foi feito ali.
Escrevendo na tela
Console.WriteLine("Hello World!!!");
Na linha acima estamos usando o método ‘WriteLine’ da classe ‘Console’ que por sua vez fica localizada no Namespace ‘System’ que simplesmente nos emite uma mensagem nesse caso ‘Hello World’. Atente-se que no final da instrução temos o ponto e virgula (;).
Testando nosso programa
Partindo do princípio que você já tenha o .NET Framework instalado em sua máquina para testarmos nosso programa devemos copiar e colar esse código no bloco de notas, por exemplo, e salvar o documento com a extensão ‘.cs’ (Csharp), depois de feito isso devemos agora compilar nosso programa com o compilador de linha de comando ‘csc.exe’ que normalmente se encontra em C:\WinDir\Microsoft.NET\Framework\V1.1.4322 onde ‘WinDir’ é a pasta de instalação do Windows. Mas antes de qualquer coisa devemos configurar nossas variáveis de ambiente para evitarmos ficar digitando o caminho inteiro onde se encontra o compilador, para configurarmos basta abrir o prompt de comando (Iniciar | Executar | cmd) e digitar:
path C:\Windows\Microsoft.NET\Framework\V1.1.4322
Feito isso temos acesso ao compilador em qualquer diretório que estivermos.
OBS: Esse é o caminho da minha máquina verifique o caminho correto de seu computador.
Compilando
Eu salvei meu arquivo com o nome de ‘Hello.cs’ no seguinte caminho:
C:\Linha de codigo\Exemplos
E para compilar faça:
csc Hello.cs
Como na imagem a seguir (respeitando onde foi salvo seu arquivo):
Figura 1: Compilando o Hello World
Veja que é gerado um arquivo ‘Hello.exe’ para executá-lo basta digitar ‘Hello’ no diretório onde ele foi salvo:
Figura 2: programa sendo executado
Bom aqui finaliza nosso primeiro programa em C#, vimos o que significa cada parte do programa, aprendemos a configurar as variáveis de ambiente e a compilar nosso programa, agora vamos ver o que são métodos.
Métodos (Funções e rotinas)
Já citei várias vezes métodos neste artigo, mas não tive a oportunidade de explicar o que é um método por isso eis às definições.
Um método pode ser tanto uma função ou uma rotina:
Rotina: Executa alguma ação e não retorna nada.
Função: Executa alguma ação e retorna algum resultado sempre.
Em C# para criarmos uma rotina fazemos assim:
<modificador de acesso> void <nome da rotina>()
{
...
}
Exemplo:
public void MinhaRotina()
{
x = 1;
}
Neste caso temos uma rotina, pois void (vazio) significa que não há nenhum retorno simplesmente uma ação. Neste caso atribuindo o valor 1 a variável x.
E uma função é feita assim:
<modificador de acesso> <tipo de dado> <nome da função>()
{
...
}
Exemplo:
public string MinhaFuncao()
{
return “Isto é uma função pois retorna algo.”;
}
Neste caso temos uma função, pois ao invés de void (vazio) temos um valor de retorno nesse caso uma string.
Tipos de dados
Como toda linguagem de programação o C# tem seus tipos de dados básicos que são comuns a todas as linguagens habilitadas ao .NET, isso significa dizer que um inteiro (int) em C# tem a mesma estrutura e quantidades de bytes de um inteiro (Integer) em VB. Na verdade int (um inteiro de 32 bits e C#) e Integer (um inteiro de 32 bits em VB) são apenas Alias (apelidos) para os tipos ‘reais’ do CTS (Common Type System), veja a tabela:
Tipo C# |
Tipo .NET(CTS) |
Faixa de dados |
Descrição |
bool |
System.Boolean |
true ou false |
Booleano |
byte |
System.Byte |
-127 a 128 |
Inteiro de 8-bit com sinal |
char |
System.Char |
U+0000 a U+ffff |
Caracter Unicode de 16-bit |
decimal |
System.Decimal |
1,0 × 10-28 a 7,9 × 1028 |
Inteiro de 96-bit com sinal com 28-29 dígitos significativos |
double |
System.Double |
±5,0 × 10-324 a ±1,7 × 10308 |
Flutuante IEEE 64-bit com 15-16 dígitos significativos |
float |
System.Single |
±1,5 × 10-45 a ±3,4 × 1038 |
Flutuante IEEE 32-bit com 7 dígitos significativos |
int |
System.Int32 |
-2.147.483.648 a 2.147.483.647 |
Inteiro de 32-bit com sinal |
long |
System.Int64 |
–9,223,372,036,854,775,808 a 9,223,372,036,854,775,807 |
Inteiro de 64-bit com sinal |
Object |
System.Object |
|
Classe base |
Sbyte |
System.Sbyte |
0 a 255 |
Inteiro de 8-bit sem sinal |
Short |
System.Int16 |
-32,768 a 32,767 |
Inteiro de 16-bit com sinal |
String |
System.String |
|
String de caracteres Unicode |
Uint |
System.UInt32 |
0 a 4,294,967,295 |
Inteiro de 32-bit sem sinal |
Ulong |
System.UInt64 |
0 a 18,446,744,073,709,551,615 |
Inteiro de 64-bit sem sinal |
Ushort |
System.UInt16 |
0 a 65,535 |
Inteiro de 16-bit sem sinal |
Ou seja, float, por exemplo, é apenas um apelido para System.Sigle (Tipo .NET)
Além disso os tipos de dados em C# podem ser divididos em 2:
- Value Types
- Reference Types
Quando passamos como parâmetro de um método um Value Type estamos passando um COPIA de seu conteúdo em quanto Reference Type estamos passando uma Referencia (endereço de memória) do valor original, ou seja, na prática o que ocorre é que se alterarmos nesse método o valor passado (Value type) o valor original da variável não é alterado, mas se passarmos um reference type para o parâmetro do método e alterarmos o valor no método o valor estará sendo mudado na variável original.
Variáveis
Durante a execução de um programa, dados são armazenados temporariamente na memória. Uma variável é um nome que se dá a um local na memória que armazena um certo tipo de dado, assim cada variável esta associada com um tipo de dado e um valor. Em C# declaramos variáveis assim:
<tipo de dado> <variavel>;
Exemplo:
int i;
Ainda poderíamos declarar essa mesma váriavel usando o tipo .NET assim:
System.Int32 i;
Nesse caso será reservado um espaço de 4 Bytes(32bits) na memória para armazenar um valor do tipo inteiro, que será referenciado no resto do programa pelo identificador ‘i’ (nome). Você também pode inicializar variáveis em sua declaração alem de poder também declarar mais de um por linha, veja:
int i = 5;
double d1, d2;
bool fechado = false, aberto = true;
Cuidado – Case-sensitive
O C# é Case-Sensitive, ou seja, diferencia maiúsculas de minúsculas.
Isso:
int num1;
é diferente de:
int Num1;
Constantes
Constantes como próprio nome sugere são variáveis que uma vez definida seu valor ela não poderá ser mudado pelo programa, em C# declaramos constantes com a keyword const, veja:
const <tipo de dados> <nome> = <valor>;
Exemplo:
const double PI = 3.14;
Vale lembrar que uma constante deve sempre ser inicializada em sua declaração caso contrário será gerado um erro.
Conversões de dados
Existem dois tipos de conversões:
- Explícitas
- Implícitas
Quando uma variável pode ser mais de um tipo, o recurso de conversão explícita pode ser usado veja:
float x;
double y = 10.5;
x = (float) y;
Estamos atribuindo um valor a variável x do tipo float, e esse valor é a variável y que por sua vez é do tipo double e neste caso fazendo uma conversão explícita (cast) de um tipo para o outro.
Já nas conversões implícitas isso ocorre de forma transparente nas atribuições de variáveis e passagens de parâmetros de métodos, desde que você não use o cast, veja:
long x;
int y = 5;
x = y;
Neste caso estamos pegando o valor de y e simplesmente atribuindo a variável x do tipo long, isso pode ser feito sem problemas.
Conclusão
Neste artigo vimos a cara de um programa escrito em C#, seus tipos de dados básicos, o que são funções e rotinas, aprendemos o que são conversões, a configurar nossas variáveis de ambiente, a compilar um programa e o que são variáveis e constantes. Espero que tenham gostado e no próximo artigo falaremos sobre os Operadores em C#, aguardo vocês.
Qualquer dúvida, crítica ou sugestão fale comigo: cleberwd@hotmail.com