Member 12712527 Ответов: 2

Почему свойства не должны возвращать массивы...?


В программе я должен вернуть многомерный массив, чтобы я мог использовать его в другом классе.
Одним из решений является объявление этого массива статическим...
Другой способ-объявить свойство, которое через свойство GET-SET возвращает массив через свое свойство GET...

Когда я это делаю, компилятор предупреждает меня, что -- property не должен возвращать массивы...почему...?

Что я уже пробовал:

Объявлено в дочернем классе....
открытые строковые поля[,,,]
{
get { return row;}
}
строка-это многомерный массив....

2 Ответов

Рейтинг:
10

OriginalGriff

Начните с документации по сообщению об ошибке:
CA1819: свойства не должны возвращать массивы - Visual Studio | Microsoft Docs[^]
Это объясняет:

Microsoft:
Массивы, возвращаемые свойствами, не защищены от записи, даже если свойство доступно только для чтения. Чтобы сохранить массив защищенным от несанкционированного доступа, свойство должно возвращать копию массива. Как правило, пользователи не понимают неблагоприятных последствий для производительности вызова такого свойства. В частности, они могут использовать это свойство в качестве индексированного свойства.

Копирование массива-это большая работа, и она может привести к довольно большому падению производительности, которое скрыто в безобидной строке
for (int x = 0; x < myVar.Array.Width; x++)
   for (int y = 0; y < myVarArray.Height; y++)
      Console.WriteLine(myVar.Array[x,y]);
Выглядит как совершенно хороший код, но каждый доступ к массиву создает новую копию оригинала.

Вместо массива используйте список или аналогичную коллекцию.


0x01AA

Можете ли вы дать мне подсказку, почему список вместо массива должен помочь? На мой взгляд, также возвращение списка не мешает его изменять. Где я ошибаюсь?
Заранее спасибо.

OriginalGriff

Я абсолютно согласен - возвращать список так же плохо, но ... это мисс для тебя.
Возврат любой коллекции-это то, о чем нужно тщательно подумать и, вероятно, предоставить метод вместо свойства, потому что он "скрывает" операцию копирования немного меньше.
Вы получаете ошибку только в том случае, если свойство является внешне видимым, так что ...

Member 12712527

Сэр, вы говорите, что списки-это тоже плохо. Жизнеспособно ли использовать статический массив или что будет правильным решением? ..

CHill60

Предоставьте метод вместо использования свойства

0x01AA

Я бы сказал, что вывод из массива или списка и определение интерфейса только для чтения (для возврата)-это "правильное" решение, но, скорее всего, излишнее.

А также это, наконец, не мешает привести возвращаемое значение и изменить его.

OriginalGriff

В принципе, не используйте свойства для возврата коллекций - вместо этого используйте методы, чтобы было более очевидно, что это может быть копия или "сгенерированная на лету" коллекция.
Или сделайте содержащий класс непубличным: пока он содержится в сборке, VS не должен жаловаться.

Рейтинг:
1

#realJSOP

Все, что вам нужно сделать, это научиться пользоваться google.

CA1819: свойства не должны возвращать массивы - Visual Studio | Microsoft Docs[^]