domingo, 17 de maio de 2009

C# - Indexadores

Esse post não será mais atualizado nesse blog. Para visualizar esse post em seu novo endereço, acesse:
http://milaneze.com.br/post/2009/05/17/C-Indexadores.aspx


Indexadores permitem acessar uma lista de elementos através do nome do objeto usando a palavra-chave this. Usando C# convencional, um elemento de um array é acessado usando-se como índice um valor inteiro (ex.: dimensoes[1]). Com indexadores, é possível utilizar strings (ex.: caixa["largura"], onde caixa é um objeto).

Embora indexadores sejam usados como arrays, os indexadores são declarados como propriedades em uma classe. Ao contrário das propriedades, onde é possível escolher qualquer nome, os indexadores são declarados com a palavra-chave this.

A sintaxe é a seguinte:


   1:  accessModifier returnType this[ IndexType1 name1, IndexType2 name2, ... ]

   2:  {

   3:      get

   4:      {

   5:         // use name1, name2, ... here to get data

   6:      }

   7:      set

   8:      {

   9:         // use name1, name2, ... here to set data

  10:      }

  11:  }


Os códigos abaixo dão exemplos de como declarar e depois de como acessar indexadores.


   1:  class Caixa

   2:  {

   3:      private double[] dimensoes = new double[3];

   4:      private string[] medidas = { "largura", "altura", "comprimento" };

   5:   

   6:      public Caixa(double largura, double altura, double comprimento)

   7:      {

   8:          dimensoes[0] = largura;

   9:          dimensoes[1] = altura;

  10:          dimensoes[2] = comprimento;

  11:      }

  12:   

  13:      public double this[int index]

  14:      {

  15:          get

  16:          {

  17:              if (index >= 0 && index < dimensoes.Length)

  18:                  return dimensoes[index];

  19:              else

  20:                  return -1;

  21:          }

  22:   

  23:          set

  24:          {

  25:              if (index >= 0 && index < dimensoes.Length)

  26:                  dimensoes[index] = value;

  27:          }

  28:      }

  29:   

  30:      public double this[string medida]

  31:      {

  32:          get

  33:          {

  34:              int i = 0;

  35:   

  36:              foreach (string palavra in medidas)

  37:                  if (palavra == medida)

  38:                      return dimensoes[i];

  39:                  else

  40:                      i++;

  41:   

  42:              return -1;

  43:          }

  44:   

  45:          set

  46:          {

  47:              int i = 0;

  48:   

  49:              while (i < medidas.Length)

  50:              {

  51:                  if (medida == medidas[i])

  52:                      dimensoes[i] = value;

  53:                     

  54:                  i++;

  55:              }

  56:          }

  57:      }

  58:  }


Exemplo de como usar os indexadores:


   1:  class Program

   2:  {

   3:      static void Main(string[] args)

   4:      {

   5:          Caixa caixa = new Caixa(10, 20, 30);

   6:   

   7:          Console.WriteLine("Valores iniciais");

   8:          Console.WriteLine("Largura: " + caixa[0]);

   9:          Console.WriteLine("Altura: " + caixa[1]);

  10:          Console.WriteLine("Comprimento: " + caixa[2]);

  11:   

  12:          caixa[0] = 40;

  13:          caixa[1] = 50;

  14:          caixa[2] = 60;

  15:   

  16:          Console.WriteLine("\nValores mudados e acessados com indexador do tipo int");

  17:          Console.WriteLine("Largura: " + caixa[0]);

  18:          Console.WriteLine("Altura: " + caixa[1]);

  19:          Console.WriteLine("Comprimento: " + caixa[2]);

  20:   

  21:          caixa["largura"] = 70;

  22:          caixa["altura"] = 80;

  23:          caixa["comprimento"] = 90;

  24:   

  25:          Console.WriteLine("\nValores mudados e acessados com indexadir do tipo string");

  26:          Console.WriteLine("Largura: " + caixa["largura"]);

  27:          Console.WriteLine("Altura: " + caixa["altura"]);

  28:          Console.WriteLine("Comprimento: " + caixa["comprimento"]);

  29:   

  30:          Console.ReadLine();

  31:      }

  32:  }

Nenhum comentário: