Массив клонирования при доступе? - PullRequest
3 голосов
/ 04 июня 2011

Я читал код библиотеки XNA, и внутри типа VertexPositionColor они подавляют сообщение CA2105:ArrayFieldsShouldNotBeReadOnly с обоснованием: «Затраты на производительность клонирования массива при каждом его использовании слишком велики».

public struct VertexPositionColor
{
    public static readonly VertexElement [ ] VertexElements;
}

Но зачем его копировать, когда он используется? Это происходит только для структур, где доступное свойство / поле имеет значение ValueType, верно?

Ответы [ 2 ]

3 голосов
/ 04 июня 2011

Я думаю, они оправдывают тот факт, что они выставляют array field больше, чем что-либо еще, и основная причина, по которой они это делают, - это производительность:

Альтернатива, которую они, вероятно, имели вРазум делал array field закрытым с property, выставляющим IEnumerable или возвращая копию array каждый раз, когда property принимался.

РЕДАКТИРОВАТЬ.Немного отредактировал ответ, чтобы прояснить то, что я пытался сказать: стр.

1 голос
/ 04 июня 2011

В большинстве случаев им было бы лучше использовать Array.AsReadOnly и возвращать универсальную коллекцию ReadOnlyCollection.Согласно документации это операция O (1).

В текущей реализации вызывающие могут изменять значения в массиве (изменяя статическое / глобальное состояние напрямую).

Еще одна причина прочитать Руководство по проектированию фреймворка - в нем приведены причины, лежащие в основе рекомендаций FxCop.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...