C# -  Indexadores. Já ouviu falar ? Sabe para que serve ?


 Neste artigo vou apresentar o conceito de indexadores na linguagem C# e a sua utilidade.

O que são Indexadores ou Indexers ?

Para iniciar, vamos recorrer ao site da Microsoft para ver qual a definição de indexadores e as suas propriedades.

"Os Indexadores permitem que as instâncias de uma classe ou estrutura sejam indexadas apenas como vetores. Indexadores lembram properties a não ser que seus acessores recebam parâmetros."

Visão Geral:

Então para que serve mesmo um indexador ?

A utilidade é fornecer uma sintaxe para acessar, através do índice, itens de um objeto que represente uma coleção.

Observe 3 palavras chaves :  índice , objeto, coleção

Nota : Para entender o conceito de indexadores você tem que conhecer arrays e/ou coleções e sua sintaxe.

Dessa forma você pode criar uma classe que representa uma coleção e pode acessar os itens da coleção, os seus objetos, do mesmo modo que faz quando acessa um array.(usando índices)

Dizendo a mesma coisa em outras palavras : Os indexadores permitem que um tipo possa ser acessado da mesma forma que uma array (usando índices).

Para declarar um indexador em uma classe ou struct, use a palavra-chave this, como neste exemplo:

public int this[int index]    // declaração do Indexer
{
    // acessores get e set 
}

Veja que a sintaxe é bem simples:

Vejamos um exemplo prático para clarear o entendimento...

Recursos usados:

Nota: Baixe e use a versão Community 2015 do VS ela é grátis e é equivalente a versão Professional.

Criando o projeto no VS Community

Abra o VS Community 2015 e clique em New Project;

Selecione a linguagem Visual C# e o template Windows Forms Application;

Informe o nome DataGridView_Crud e clique no botão OK;

A seguir clique em Project -> Add Class e informe o nome Time.

A seguir inclua o código abaixo no arquivo Time.cs:

 public class Time
    {
        string[] _valores = new string[10]; //define os limites do array
        public string this[int numero]
        {
            get
            {
                // Será invocado quando acessarmos instâncias da classe Time com []
                if (numero >= 0 && numero < _valores.Length)
                {
                    // retorna o valor armazenado
                    return _valores[numero];
                }
                // Retorna um erro
                return "Erro";
            }
            set
            {
                // Será invocado quando atribuímos valores a instâncias de Time com []
                if (numero >= 0 && numero < _valores.Length)
                {
                    // atribui valor ao elemento
                    _valores[numero] = value;
                }
            }
        }
    }

A seguir vamos usar o indexador definido na classe Time.

Inclua o código abaixo no método Main() da classe Program:

    class Program
    {
        static void Main(string[] args)
        {
            // Cria uma instância da classe Time e atribui elementos
            // ... no array através dos indexadores
            Time time = new Time();
            time[1] = "Palmeiras";
            time[3] = "Santos";
            time[5] = "São Paulo";
            time[7] = "Corintians";
            time[-1] = "Flamento";
            time[1000] = "Erro";
            // Le os elementos usando os indexadores
            string valor1 = time[1];
            string valor2 = time[3];
            string valor3 = time[5];
            string valor4 = time[7];
            string valor5 = time[9];
            string valor6 = time[-1];
            // Escreve o resultado
            Console.WriteLine(valor1);
            Console.WriteLine(valor2);
            Console.WriteLine(valor3);
            Console.WriteLine(valor4);
            Console.WriteLine(valor5); // É null
            Console.WriteLine(valor6);
            Console.Readkey();
        }
    }

Executando o projeto iremos obter o seguinte resultado :

Neste programa criamos  uma classe Time com um indexador definido.

A classe Time contém um indexador que possui um método com get para obter valores e set para atribuir valores.

Os acessores (get e set) possuem a lógica que assegura que o array não será acessado fora dos seus limites (10 elementos).

O programa exibe os 4 primeiros elementos válidos da classe Time, um valor inválido (null) e também o resultado de um acesso inválido. (Erro)

O recurso indexadores era muito usado antes da introdução das coleções Generics.

Observe que você tem que implementar a função que acessa e atribui valores ao item.

Pegue o projeto completo aqui : CSharp_Indexers.zip

Deitar-me faz em verdes pastos, guia-me mansamente a águas tranqüilas.Refrigera a minha alma; guia-me pelas veredas da justiça, por amor do seu nome.
Salmos 23:2,3

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Referências:


José Carlos Macoratti