O recurso foi introduzido na versão C# 3.0 permitindo criar um elemento interno dentro de uma classe e fornecer de maneira simples as classes externas e internas o acesso a esses elementos, o acesso pode ser realizado da mesma forma que acessamos índices de um array. 

 

"Um indexador é um membro que habilita um objeto indexado da mesma maneira que um array.  
 Hejlsberg et al., p. 498"

 

Utilizamos propriedades indexada quando precisamos ter a referência de um objeto dentro de uma coleção de objetos.

No mundo real isso acontece quando consultamos o sumário de um livro, identificamos a página que possui o assunto do nosso interesse e posteriormente paginamos tendo como referência o número de cada página até chegar na respectiva página de interesse, ou quando estamos dentro do metrô observando as estações que estão passando que é o índice (indicador) da localidade que devemos descer.

 

Sintaxe Básica 

 

Temos a seguir a sintaxe básica da declaração de uma propriedade com índice. 

 

using System;

namespace DevBrasil
{
     class Program
     {

          // declaração de um propriedade indexada
          public int this[int index] { /* implementar get; set  acessores ;  */ }

          static void Main(string[] args)
          {

          }
      } 
 }

 

Consultando índice ( List<T> x Classe )  

 

Geralmente quando consultamos um índice utilizamos um objeto do tipo List, esse é o cenário mais comum, porém em algumas situações é interessante consultar o índice no objeto da própria classe, principalmente quando as propriedades da classe externa é privada. 

 

No código abaixo temos as duas situação, onde consultamos o índice pelo objeto List e objeto Class.  

 

using System;
using System.Collections.Generic;

namespace DevBrasil
{
     public class Program
     {
         static void Main(string[] args)
         {
              // Cria uma instancia da Classe DevBrasil
              DevBrasil devBrasil = new DevBrasil();

              // Adiciona um membro dentro da coleção DevBrasil
              devBrasil.Membro.Add(new Membro("Zé Trovão"));
              devBrasil.Membro.Add(new Membro("Tonho da Lua"));

              // Altera o nome do primeiro Membro 
              // Utilizando a forma tradicional de uma coleção

              // Observe que estamos consultando um índice dentro de um List<Membro>
              devBrasil.Membro[0].Nome = "Leandro Rodrigues";

              // Altera o nome do primeiro Membro 
              // Utilizando a propriedade padrão 

              // Observe que estamos consultando um índice através de uma classe Membro
              devBrasil[0].Nome = "Rodrigo Sebastian";
          }
      }

      public class DevBrasil
      {
          // Coleção de Membro do objeto DevBrasil
          private List < Membro > _listMembro = new List Membro >();
          public List < Membro >  Membro
          {
               get { return _listMembro; }
               set { _listMembro = value; }
          }

          // Propriedade indexada
          public Membro this[int index]
          {
              get { return _listMembro[index]; }
              set { _listMembro[index] = value; }
          }
      }


     public class Membro
     {
          // Construtor da classe
          public Membro(string nome)
          {
              this._nome = nome;
          }

          // Propriedade nome 
          private string _nome;
          public string Nome
          {
               get { return _nome; }
               set { _nome = value; }
          }
     }
}

  

Framework .NET

 

Utilizamos muitas vezes propriedades indexada mesmo não tendo conhecimento, esse recurso existe dentro do Framework .NET, por exemplo a classe String possui portabilidade a index. 

 

using System;

namespace DevBrasil
{
     class Program
     {
         static void Main(string[] args)
         {
             string devBrasil = "DevBrasil Prazer em desenvolver software";
             Console.WriteLine(devBrasil[1]);
         }
     } 
 } 

 

O simples exemplo acima mostra na tela do usuário a letra "e" utilizando propriedade indexada.

 

Quando usar

 

Quando é necessário utilizar indexadores para fornecer acesso a dados armazenados em uma matriz interna.

Quando você tem que fornecer itens de uma coleção.

 

Quando não usar

 

Não é aconselhável utilizar em tipos diferentes de Int32,Int64, System.String, String.Object, enumerações ou parâmetos do tipo genérico.

 

Nesse artigo, foi explicado como fazer a utilização de uma propriedade indexada, vantagens e destantagens, bem como, evidenciado qual é a diferença de utilizar uma propriedade indexada ao invés de uma coleção de objetos através de um List<T>.

 

Para saber mais:

Aprofundo seu conhecimento sobre C#

Design de propriedade indexada

Exibições: 766

Comentar

Você precisa ser um membro de DevBrasil para adicionar comentários!

Entrar em DevBrasil

Comentário de Indexado em 23 agosto 2016 às 21:19

Indexado (indexado.com.br) é uma agenda de eventos das cidades do Brasil listados por ordem de horário.

Inclui opções de Gastronomia, Cultura, Esporte, Turismo, Noite e também empresas e prestadores de serviço.

Além de informar sobre lazer, atua como ferramenta de utilidade pública. Um guia da cidade, facilitando a vida das pessoas.

Como funciona:

Estabelecimentos e pessoas físicas podem cadastrar-se gratuitamente, criando sua página no site.

Nesta página você divulga seu local, produto, serviço e principalmente eventos.

Você também pode divulgar um evento apenas colando o link de um evento do facebook.

Experimente, é fácil e grátis.

Planos pagos:

No computador, tablet ou celular as pessoas acessam a timeline de eventos do Indexado procurando algum lugar para ir e o que fazer.

Confira como anunciar: www.indexado.com.br/anuncie

Maiores informações: contato@indexado.com.br.

Ah... e curta nossa página.

www.indexado.com.br

www.facebook.com/IndexadoBR

www.twitter.com/indexadobr

Comentário de Alberto Monteiro em 22 março 2012 às 15:54

Só explicando melhor a ideia:

Dada a classe =>

public class Pessoa
{
    public string Nome { get; set; }
    public int Idade { get; set; }
}

O uso =>

Pessoa pessoa = new Pessoa();

//Uso normal
pessoa.Nome = "Alberto";
Console.WriteLine(pessoa.Nome);

//Usando reflection
var property = typeof(Pessoa).GetProperty("Nome");
Console.WriteLine(property.GetValue(pessoa,null));

//Usando minha ideia para propriedade indexada
dynamic p = pessoa;
Console.WriteLine(p["Nome"]);

Mas para usar essa ultima opção meu framework modificaria seu codigo no Build por exemplo e faria isso:

public class Pessoa
{
    public string Nome { get; set; }
    public int Idade { get; set; }

public object this[string propertyName]
{
    get
    {
        if(propertyName == "Nome")
            return Nome;
        if(propertyName == "Idade")
            return Nome;
        return null;
        }
    }
}

Seu fonte não seria modificado, somente o assembly gerado, por isso o uso de dynamic.

Já tem "plugins" que fazem algo parecido hoje, que é o caso do NotifyPropertyWeaver, esse faz  a implementação automaticamente da interface INotifyPropertyChanged.

Como eu disse anteriormente uso de GetValue do reflection é custoso, usando dynamic você vai ter um cache e será quase tão rapido quanto o acesso direto.

Comentário de Alberto Monteiro em 22 março 2012 às 12:56
Leandro você não entendeu a minha proposta
A minha proposta é criar uma propriedade indexada para retornar o valor das outras propriedades existentes. Se você tem uma classe com 2 propriedades, A e B, vc usaria
var classe = new Classe();
classe.A

vou fazer uma solução que vô e possa fazer isso
dynamic classe = new Classe();
classe["A"]

Qual o motivo que me leva a fazer isso, é o custo de reflection, usar getvalue é pesado, e com essa forma vc acessaria diretamente o valor da propriedade.
Comentário de Leandro Rodrigues em 22 março 2012 às 10:38

Alberto,

 

Sua idéia é bacana, só que compensa nesse cenário você utilizar uma lista mesmo List<T> .

A microsoft aconselha a não utilizar propriedade indexada se os tipos forem diferentes de

Int32, Int64, System.String, System.Object, enumerações ou parâmetros de tipo genérico.

 

Abraços,

 

Leandro Rodrigues

Comentário de Alberto Monteiro em 20 março 2012 às 9:57

Vou ver se faço isso em tempo de execução para qualquer tipo de objeto :)

Caso você crie um objeto vai poder acessar suas propriedades assim 

var pessoa = new Pessoa();
pessoa.Nome = "Teste";

Console.WriteLine(pessoa["Nome"]);

Comentário de Márcio Araújo em 3 março 2012 às 9:53

Massa, não conhecia essa "propriedade indexada" . Valeu Leandro sempre detonando nos artigos.

Comentário de Reginaldo Bras Floriano em 28 fevereiro 2012 às 23:54

Recurso interessante, podendo facilitar muito as tarefas com isso. Valeu.

Comentário de Leandro Carvalho Guimarães em 28 fevereiro 2012 às 7:51

Parabéns

Comentário de Yan de Lima Justino em 26 fevereiro 2012 às 9:21

Muito bom este recurso. Já sei até em que vou aplicar. rsrsrsr

© 2017   Criado por Ramon Durães.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço