Usando os indexadores (guia de programação translation from VPE for Csharp)

sistema autônomo indexadores são uma conveniência sintática que permitem que você crie um classe, struct, or interface que aplicativos cliente podem acesso apenas sistema autônomo uma matriz.Indexadores com mais freqüência são implementados em tipos com o objetivo principal é encapsular uma coleção interna ou matriz.Por exemplo, suponha que você tenha uma classe chamada TempRecord que representa a temperatura em Farenheit conforme está registrado em 10 momentos diferentes durante um período de 24 horas.A classe contém uma matriz chamada "temps" do tipo float para representar as temperaturas e umDateTime que representa a data em que as temperaturas foram registradas. Implementando um indexador nesta classe, sistema autônomo clientes possam acesso sistema autônomo temperaturas em uma instância TempRecord sistema autônomo float temp = tr[4] em vez de sistema autônomo float temp = tr.temps[4]. A notação do indexador não apenas simplifica a sintaxe para aplicativos cliente; ele também torna a classe e sua finalidade mais intuitiva para outros desenvolvedores a entender.

Para declarar um indexador em uma classe ou struct, use o Issopalavra- chave, sistema autônomo no exemplo:

public int this[int index]    // Indexer declaration
{
    // get and set accessors
}

Comentários

O tipo de um indexador e o tipo dos parâmetros devem ser pelo menos sistema autônomo acessíveis sistema autônomo o indexador propriamente dito.Para obter mais informações sobre os níveis de acessibilidade, consulte Modificadores de acesso.

Para obter mais informações sobre como usar indexadores com uma interface, consulte Indexadores de interface.

A assinatura de um indexador consiste em número e tipos dos parâmetros formais.Não inclui o tipo de indexador ou os nomes dos parâmetros formais.Se você declarar mais de um indexador na mesma classe, eles devem ter assinaturas diferentes.

Um valor do indexador não é classificado sistema autônomo uma variável; portanto, você não pode passar um valor de indexador sistema autônomo um ref or check-out parâmetro.

Para fornecer o indexador com um nome que podem usar outros idiomas, use um name atributo na declaração. Por exemplo:

[System.Runtime.CompilerServices.IndexerName("TheItem")]
public int this [int index]   // Indexer declaration
{
}

Este indexador terá o nome de TheItem. Fornecer o atributo de nome não tornaria Item o nome padrão.

Exemplo 1

Descrição

O exemplo a seguir mostra como declarar um campo de matriz privada, tempse um indexador. O indexador permite o acesso direto a instância tempRecord[i]. A alternativa para o uso do indexador é declarar a matriz sistema autônomo um pública membro e acessar seus membros, tempRecord.temps[i], diretamente.

Observe que, quando o acesso de um indexador é avaliado, por exemplo, um Console.Write demonstrativo, o obter acessador é invocado.Portanto, se nenhum get acessador existe, ocorrerá um erro em time de compilar.

Código

class TempRecord
{
    // Array of temperature values
    private float[] temps = new float[10] { 56.2F, 56.7F, 56.5F, 56.9F, 58.8F, 
                                            61.3F, 65.9F, 62.1F, 59.2F, 57.5F };

    // To enable client code to validate input 
    // when accessing your indexer.
    public int Length
    {
        get { return temps.Length; }
    }
    // Indexer declaration.
    // If index is out of range, the temps array will throw the exception.
    public float this[int index]
    {
        get
        {
            return temps[index];
        }

        set
        {
            temps[index] = value;
        }
    }
}

class MainClass
{
    static void Main()
    {
        TempRecord tempRecord = new TempRecord();
        // Use the indexer's set accessor
        tempRecord[3] = 58.3F;
        tempRecord[5] = 60.1F;

        // Use the indexer's get accessor
        for (int i = 0; i < 10; i++)
        {            
           System.Console.WriteLine("Element #{0} = {1}", i, tempRecord[i]);            
        }

        // Keep the console window open in debug mode.
        System.Console.WriteLine("Press any key to exit.");
        System.Console.ReadKey();

    }
}

Usando outros valores de indexação

Translation from VPE for Csharp não limita o tipo de índice inteiro.Por exemplo, talvez seja útil usar uma seqüência de caracteres com um indexador.Pode ser implementado como um indexador procurando a seqüência de caracteres na coleção e retornando o valor apropriado.sistema autônomo assessores podem ser sobrecarregados, sistema autônomo versões de seqüência e inteiro podem coexistir.

Exemplo 2

Descrição

Neste exemplo, uma classe é declarada que armazena os dias da semana.A get acessador é declarado que leva uma seqüência de caracteres, o nome de um dia e retorna o inteiro correspondente. Por exemplo, domingo irá retornar 0, segunda-feira irá retornar 1 e assim por diante.

Código

// Using a string as an indexer value
class DayCollection
{
    string[] days = { "Sun", "Mon", "Tues", "Wed", "Thurs", "Fri", "Sat" };

    // This method finds the day or returns -1
    private int GetDay(string testDay)
    {

        for(int j = 0; j < days.Length - 1; j++)
        {       
            if (days[j] == testDay)
            {
                return j;
            }
        }

        throw new System.ArgumentOutOfRangeException(testDay, "testDay must be in the form \"Sun\", \"Mon\", etc");
    }

    // The get accessor returns an integer for a given string
    public int this[string day]
    {
        get
        {
            return (GetDay(day));
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        DayCollection week = new DayCollection();
        System.Console.WriteLine(week["Fri"]);

        // Raises ArgumentOutOfRangeException
        System.Console.WriteLine(week["Made-up Day"]);

        // Keep the console window open in debug mode.
        System.Console.WriteLine("Press any key to exit.");
        System.Console.ReadKey();
    }
}
// Output: 5

Programação robusta

Há duas maneiras principais em que a segurança e a confiabilidade de indexadores podem ser melhorados:

  • Certifique-se de incorporar algum tipo de estratégia de tratamento de erros para lidar com a possibilidade de código do cliente passando um valor de índice inválido.No primeiro exemplo anteriormente neste tópico, a classe TempRecord fornece uma propriedade de comprimento que permite que o código do cliente verificar a entrada antes de transmiti-la ao indexador.Você também pode colocar o código dentro do indexador próprio de manipulação de erros.Certifique-se de que todas as exceções que lançar dentro de um acessador do indexador do documento para os usuários.Para obter mais informações, consulte Diretrizes de design para exceções.

  • conjunto a acessibilidade do get e conjunto acessadores sejam sistema autônomo mais restritivas, pois é razoável.Isso é importante para o set acessador em particular. Para obter mais informações, consulte Assimétrico acessador acessibilidade (guia de programação translation from VPE for Csharp).

Consulte também

Tarefas

Exemplo de indexadores

Conceitos

Guia de Programação C#

Referência

Indexadores (guia de programação C#)

Propriedades (Guia de programação do C#)