FxCop: возвращение матрицы как свойства (C #) - PullRequest
0 голосов
/ 06 июля 2011

У меня есть статический класс «По умолчанию», который должен содержать матрицы по умолчанию, которые пересылаются на интерфейс, который запрашивает double[][] в конце.До сих пор я просто помещал в этот класс статические свойства, которые возвращают double[][] s.

. Теперь, чтобы это соответствовало стандартам кодирования нашей компании, код должен соответствовать правилу FxCop CA1819 , котороене позволит мне вернуть неровный массив из свойства, как я сделал.И вместо массивов я верну IList или IEnumerable (как обсуждено здесь ).

«Достаточно справедливо», - подумал я, поэтому я реализовал свойство для возврата IList<IList<double>>(хотя вложенные типы тоже не круты).Однако, как я уже сказал, интерфейс, с которым мне нужно работать, в конце запрашивает double[][] матрицы. Я понятия не имею, как получить этот список списков в массив массивов без явного преобразования каждого списка обратно..Конечно, я мог бы, но это создало бы безумное количество накладных расходов, тем более что я даже не получаю доступ к этим матрицам - я только передаю их через интерфейс.

(PS: я знаю, этоОшибка интерфейса, но на данный момент мы не можем это изменить.)

Редактировать: я обнаружил, что использование ILists<IList<double>> не помогает в любом случае, поскольку оно нарушает CA1006 .Простое решение, которое я принял, чтобы заставить FxCop замолчать, было сделать свойства внутренними.В любом случае, более хорошее решение указано ниже.В качестве альтернативы можно рассмотреть возможность использования индексированного свойства, хотя это немного запутанно в C #.

Ответы [ 2 ]

2 голосов
/ 06 июля 2011

Я предлагаю создать класс Matrix<T>, который принимает T[][] в свой конструктор и может быть преобразован в T[][], а ваши свойства в Defaults возвращают экземпляр Matrix<double>. Преобразование может быть реализовано неявно, явно или с использованием метода.

0 голосов
/ 06 июля 2011

Существует правило FxCop, чтобы предотвратить путаницу для пользователя API и напомнить автору API, если они действительно этого хотят.

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

Из связанного правила:

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

Один из способов, которые они рекомендуют для возврата массива, состоит в изменении свойства Xxx на метод GetXxx ().

Это возможно для вас?

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