Свойство 2D массива

#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 #.