C# Как можно настроить доступ к элементам массива выступающего полем класса?


#1

Для полей типа int, string,... (не массивов) можно создать методы доступа get и set, но для полей массивов такие свойства не позволяют получить доступ к элементам массива, а лишь к ссылке записанной в поле. Есть ли какая-то конструкция позволяющая получить доступ к элементам массива напрямую? или нужно вручную создавать свои собственные методы?


#2

Используйте индексатор либо их ещё называют индексируемыми свойства. Пример создания и использования индексатора:

public Program()
{
    Random random = new Random();

    for (int i = 0; i < array.Length; i++)
    {
        array[i] = random.Next(100);
    }
}

public int this[int index]    // индексатор
{
    get
    {
        if (index >= 0 && index < array.Length)
        {
            return array[index];
        }
        throw new ArgumentException("переданный индекс выход за приделы массива");
    }

    set
    {
        if (index >= 0 && index < array.Length)
        {
            array[index] = value;
        }

        throw new ArgumentException("переданный индекс выход за приделы массива");
    }
}


static void Main(string[] args)
{
    Program program = new Program();
    for (int i = -2; i < 7; i++)
    {
        try
        {
            Console.WriteLine(program[i]);
        }
        catch (Exception)
        {
            Console.WriteLine($"i = {i}");
        }
    }

    Console.ReadKey();
}

Результат работы кода:

i = -2
i = -1
35
66
0
3
27
i = 5
i = 6

В индексаторе может быть несколько индексов и они могут быть разных типов.

public int this[int index, string index2]

Также при работе с индексаторами вам нужно учитывать возможность выхода за пределы массива как приведено в примере, логику доступа к элементам задаёте вы.