C#

Olá a todos,

é verdade depois de um tempo todo mundo aparece… fiquei sem fazer posts nesses últimos dias porque por enquanto eu trabalho com um chefe maluco que joga 3 projetos para eu Administrar, Programar, Criar a Modelagem e Colocar em Produção em apenas 1 mês!

Definitivamente acabou com minha vida, e pra completar vou ter que viajar pra Angola no dia 6 de setembro… é a vida, mas vamos ao que interessa… Arrays em C#!

Bem.. a maioria das pessoas que já desenvolveram podem pular esse paragrafo. O array nada mais é uma seqüência de elementos do mesmo tipo, esses elementos são acessados por um índice do tipo int.

Em questão de memória o Array residem em um bloco contíguo da memória e são tipo-referência, em questão de OO Array também é uma classe, como sempre volto a repetir.. quer saber mais sobre tal classe, interface e etc.? Procure no Object Browser no seu Visual Studio 2008 “CTRL+W, J”.

Declarando e Instânciando Array

A declaração de um array é feito especificando o nome do tipo de elemento seguido por um par de colchetes “[]” e o nome do próprio array:

int[] motosID;

Como toda boa classe sem você instância-la você não faz nada! precisamos criar o objeto. Para instancia-lo utiliza-se a keyword new com o tipo do array seguido com o tamanho dentro de colchetes… Instanciar um array também inicializa seus valores padrões (0, null ou false dependendo do tipo do array)

motosID = new int[9]; // instância o array motos com o tamanho 10 (os índices iniciam contando do 0)
/* Você também pode inicializar, instanciar e definir os valores ao mesmo tempo */
int[] motosID = { 10, 11, 12, 13, 14, 15, 16 };

Também é possível criar Arrays multidimensionais, mas esse não é o objetivo desse artigo.

Você também pode criar Arrays utilizando estruturas (structs) e classe como o tipo do Array.

public class Moto{
// ...
    public Moto(){
        //Construtor padrão
    }
<pre>    public Moto(string nomeMoto){
        //Construtor com argumento
    }</pre>
}

Moto[] intruder = new Moto[1] { new Moto("Intruder125cc"), new Moto("Intruder250cc") };
/* Você pode usar o construtor da classe para iniciar os valores do array */

Iniciando um Array sem Tipo

Muitas vezes você não sabe qual vai ser o tipo do array à ser utilizado, porém você ainda precisa declara-lo… com isso o C# pode “adivinhar” o tipo dos valores que estão sendo utilizados.

var carros = new[]{"Palio", "Siena", "Punto"};

As novidades aqui são: a palavra-chave “var”; a omissão dos colchetes após o tipo (porque não existe tipo aqui ao declarar); a utilização do operador new e os colchetes antes da lista inicializadora.

Para utilizar esse recurso infelizmente você tem que assegurar que todos os valores do array serão iguais se no exemplo acima se eu colocasse depois do punto um valor int você obteria um erro.

Caso os valores sejam compatíveis o compilador converte automaticamente os valores, exemplo:

var numeros = new[]{5, 6, 7, 8, 9, 9.5, 9.6, 9.9, 10} // nesse caso o array não será int mas sim double

Talvez agora para você um array não tipado pode não ter muito sentido, eles são mais úteis utilizados em conjunto com tipos anônimos, mas isso é assunto para outro post.

Acessando Elementos no Array

Agora que já aprendemos a criar um array, precisamos recuperar os valores armazenados lá dentro.

int[] numeros = {1, 2, 3, 4, 5};
Console.WriteLine(numeros[0]); // O valor 1 será impresso na sua tela
//vamos modificar o valor daquela posição do array
numeros[0] = 11;
Console.WriteLine(numeros[0]); // O valor 11 será impresso na sua tela

Como nós sabemos que pode exestir problemas como em qualquer ciração feita pelo ser humano, alguém pode requisitar um índice de acesso que não existe, para isso temos que tratar o erro:

try{
    int[] numeros = {1, 2, 3, 4, 5};
    Console.WriteLine(numeros[5]);
} catch (IndexOutOfRangeException e){
 // código para  tratar o erro
}

Não só isso mas existe a necessidade também de percorremos um array inteiro, claro que para isso podemos utilizar o famoso FOR!!!

int[] numeros = {5, 6, 7, 8, 9, 10,, 11, 12, 13, 14, 15};

for(int i = 0; i < numeros.Length; i++){
int numero = numeros[i];
Console.WirteLine(numero);
}

Length é uma propriedade e não um array, por isso não é utilizados colchetes “()” ao acessa-lo. Lembre-se que o índice do array começa com zero então a última posição é Length – 1. Você também pode utilizar o foreach para percorrer um elemento.

int numeros = {5, 6, 7, 8, 9, 10,, 11, 12, 13, 14, 15};
foreach (int numero in numeros){
Console.WriteLine(numero);
}

O foreach declara uma variável de iteração (neste caso o inteiro numero) que recebe cada valor do Array numeros e executa as instruções seguintes, em primeira vista isso é maravilhoso para percorrer, mas infelizmente você fica limitado:

  1. Percorrer apenas em uma parte do Array, ou pular certos elementos. O foreach percorre ele todo obrigatóriamente
  2. Percorrer o Array de trás para frente, o foreach percorre o Array sempre do 0 à Lenght -1
  3. Se o corpo do loop necessita saber o índice ao invéz do valor atual.
  4. Se você precisar alterar o valor de um elemento no array também ficará limitado
  5. Etc.

Copiando Arrays

Como um array é um tipo-referência uma variável Array possui uma referência a uma instância do Array, isso quer dizer que ao copiar um Array você acaba copiando a referência e não o Array em si próprio.

int[] inteiros = {1, 2, 3, 4, 5, 6, 7, 8, 9, 11};
int[] inteirosSegundo = inteiros;

O problema desse exemplo acima, é que se você modificar alguma valor no Array do inteirosSegundo você estará modificando o valor do Array ponteiros, e vice-versa…

Para copiar o Array é necessário criar outro Array do mesmo tipo e com o mesmo tamanho e criar um FOR para percorrer os valores do Array para o outro Array a ser copiado, exemplo:

int[] inteiros = {1, 2, 3, 4, 5, 6, 7, 8, 9, 11};
int[] inteirosCopy = new  int[inteiros.Length];

for(int i = 0; i < inteiros.Length; i++){
inteirosCopy[i] = inteiros[i];
}

O legal é que a classe System.Array nos fornece alguns métodos legal, e dentre elas é CopyTo() que copia os valores de um Array para outro partindo de um determinado índice.

int[] inteiros = {1, 2, 3, 4, 5, 6, 7, 8, 9, 11};
int[] inteirosCopy = new int[inteiros.Length];
inteiros.CopyTo(inteirosCopy, 0);

Um detalhe é que esse método é estático, então você pode utilizar esse método a partir da própria classe System.Array.

int[] inteiros = {1, 2, 3, 4, 5, 6, 7, 8, 9, 11};
int[] inteirosCopy = new int[inteiros.Length];
Array.CopyTo(inteiros, inteirosCopy, inteirosCopy.Length);

Para mais detalhes de uma olhada no Object Browser do seu Visual Studio.

Você também tem o método Clone no seu objeto de Array ele retorna um object, para copiar os valores é necessário fazer um casting (casting será abordado em outro post, aguardem)

Boa sorte!

Posts Relacionados