Indexador C#

Resumo : neste tutorial, você aprenderá como usar o indexador C# para tornar um objeto indexado como um array.

Introdução ao indexador C#

Um índice permite que um objeto de uma classe seja indexado como um array . Para definir um indexador para uma classe, use a seguinte sintaxe:

class MyClass
{
    public type this[int index]
    {
        get { // return a value }
        set { // assing a value }
    }
}Linguagem de código:  C#  ( cs )

A sintaxe de um indexador é como uma propriedade , exceto que seu acessador recebe um parâmetro:

  • Primeiro, defina o typevalor de retorno.
  • Segundo, defina o indexador usando a thispalavra-chave use.
  • Terceiro, defina um parâmetro do indexador. O parâmetro não precisa ser um número inteiro. O tipo do parâmetro depende de como você projeta o mecanismo de pesquisa. Além disso, um indexador pode ter mais de um parâmetro.
  • Por fim, defina os acessadores gete set. O getacessador retorna um valor enquanto o setacessador atribui um valor. Se o indexador não tiver o setacessador, será um indexador somente leitura.

Observe que os indexadores podem estar sobrecarregados. Em outras palavras, uma classe pode ter vários indexadores.

Se você omitir o setacessador, o indexador se tornará somente leitura. Nesse caso, você pode usar a sintaxe incorporada à expressão para encurtar sua definição:

class MyClass
{
    public type this[int index] => returnValue;
}Linguagem de código:  C#  ( cs )

Observe que você não precisa usar a getpalavra-chave.

A partir do C# 7, você pode usar sintaxe com corpo de expressão para ambos gete setacessadores. No entanto, você precisa usar as palavras-chave gete setneste caso:

class MyClass
{
    public type this[int i]
    {
        get => member[i];
        set => member[i] = value;
    }
}Linguagem de código:  C#  ( cs )

Exemplos de indexador C#

Vejamos alguns exemplos de uso de indexadores.

1) Exemplo de indexador somente leitura C#

Suponha que você tenha uma frase como a seguinte:

"C# is awesome"Linguagem de código:  C#  ( cs )

E você deseja acessar cada palavra da frase usando um índice. Por exemplo:

sentence[0]Linguagem de código:  C#  ( cs )

Deve retornar a primeira palavra ( C#), não o primeiro caractere ( C):

"C#"Linguagem de código:  C#  ( cs )

Para fazer isso, você pode definir uma nova classe e usar um indexador.

Primeiro, crie um novo arquivo chamado Sentence.cs.

Segundo, defina a Sentenceclasse no Sentence.csarquivo:

// Sentence.cs

class Sentence
{
    private string[] words;

    public Sentence(string s)
    {
        words = s.Split(' ');
    }
}Linguagem de código:  C#  ( cs )

O Sentence()construtor divide uma string de entrada pelo espaço em palavras e atribui o resultado ao wordscampo.

Terceiro, defina um indexador na Sentenceclasse:

// Sentence.cs

class Sentence
{
    private string[] words;
    public Sentence(string s)
    {
        words = s.Split(' ');
    }

    public string this[int index]
    {
        get
        {
            return words[index];
        }
    }
}Linguagem de código:  C#  ( cs )

Neste exemplo, o indexador retorna a palavra da frase com base em um índice.

A seguir ilustra como usar o indexador do objeto da frase:

// Program.cs
var sentence = new Sentence("C# is awesome");

Console.WriteLine(sentence[0]);
Console.WriteLine(sentence[1]);
Console.WriteLine(sentence[2]);Linguagem de código:  C#  ( cs )

Saída:

C#
is
awesomeLinguagem de código:  C#  ( cs )

Como o indexador na Sentenceclasse é somente leitura, você pode encurtá-lo usando a sintaxe incorporada à expressão como esta:

// Sentence.cs
class Sentence
{
    private string[] words;
    public Sentence(string s)
    {
        words = s.Split(' ');
    }

    public string this[int index] => words[index];
}Linguagem de código:  C#  ( cs )

2) Exemplo de indexador C# com acessadores set e get

O exemplo a seguir define a classe Matrixque usa um array multidimensional como campo e um indexador para acessar seus elementos:

// Matrix.cs
class Matrix
{
    private double[,] data;
    public Matrix(int row, int column)
    {
        data = new double[row, column];
    }

    public double this[int row, int column]
    {
        get { return data[row, column]; }
        set { data[row, column] = value; }
    }
}Linguagem de código:  JavaScript  ( javascript )

Agora, você pode usar o objeto da Matrix como um array como este:

// Program.cs
var matrix = new Matrix(3,3);

for (int row = 0; row < 3; row++)
{
    for (int column = 0; column < 3; column++)
    {
        matrix[row, column] = row + column;
    }
}


for (int row = 0; row < 3; row++)
{
    for (int column = 0; column < 3; column++)
    {
        Console.Write($"{matrix[row, column]} ");
    }
    Console.WriteLine();
}
Linguagem de código:  JavaScript  ( javascript )

Saída:

0 1 2
1 2 3
2 3 4

Observe que você pode usar a sintaxe incorporada à expressão para os acessadores gete setdo indexador.

Resumo

  • Use o indexador C# para permitir que um objeto seja indexado como uma matriz.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *