Для полей типа int, string,... (не массивов) можно создать методы доступа get и set, но для полей массивов такие свойства не позволяют получить доступ к элементам массива, а лишь к ссылке записанной в поле. Есть ли какая-то конструкция позволяющая получить доступ к элементам массива напрямую? или нужно вручную создавать свои собственные методы?
Используйте индексатор либо их ещё называют индексируемыми свойства. Пример создания и использования индексатора:
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]
Также при работе с индексаторами вам нужно учитывать возможность выхода за пределы массива как приведено в примере, логику доступа к элементам задаёте вы.