#c# #properties #multidimensional-array
#c# #свойства #многомерный массив
Вопрос:
Возможно ли написать свойство для 2D массива, которое возвращает определенный элемент массива? Я почти уверен, что не ищу индексатор, потому что их массив принадлежит статическому классу.
Комментарии:
1. Не могу получить ваш вопрос, пожалуйста, уточните
Ответ №1:
Звучит так, как будто вам нужно свойство с параметрами — что, по сути, и есть индексатор. Однако вы не можете писать статические индексаторы на C #.
Конечно, вы могли бы просто написать свойство, которое возвращает массив, но я предполагаю, что вы не хотите этого делать по соображениям инкапсуляции.
Другой альтернативой было бы написать методы GetFoo(int x, int y)
и SetFoo(int x, int y, int value)
.
Еще одной альтернативой было бы написать тип-оболочку вокруг массива и возвращать это как свойство. Тип оболочки мог бы иметь индексатор — возможно, просто доступный только для чтения, например:
public class Wrapper<T>
{
private readonly T[,] array;
public Wrapper(T[,] array)
{
this.array = array;
}
public T this[int x, int y]
{
return array[x, y];
}
public int Rows { get { return array.GetUpperBound(0); } }
public int Columns { get { return array.GetUpperBound(1); } }
}
Затем:
public static class Foo
{
private static readonly int[,] data = ...;
// Could also cache the Wrapper and return the same one each time.
public static Wrapper<int> Data
{
get { return new Wrapper<int>(data); }
}
}
Комментарии:
1. Я думал, мы не сможем вернуть массив через свойство? msdn.microsoft.com/en-us/library/0fss9skc(v=VS.100).aspx Игнорируя это, вы ответили на мой вопрос.
2. @Andrew: не мог и не должен — это не одно и то же. Вы можете вернуть ссылку на массив, но тогда у вас нет контроля над тем, как этот массив используется.
3. Я предполагаю, что реализация свойства должна читаться
return array[x, y];
, а неreturn this[x, y];
(что приведет к бесконечной рекурсии).
Ответ №2:
Вы имеете в виду что-то подобное?
array[x][y]
Где x — строка, а y — столбец.
Ответ №3:
Может быть, что-то вроде этого?:
public string this[int x, int y]
{
get { return TextArray[x, y]; }
set { TextArray[x, y] = value; }
}
Комментарии:
1. Проблема в том, что он находится в статическом классе и, следовательно, должен быть статическим членом. Вы не можете создать статический индексатор в C #.