IndexOutOfRangeException для IList <T> - PullRequest
       17

IndexOutOfRangeException для IList <T>

0 голосов
/ 20 декабря 2008

Я реализую список, и меня интересует определение IndexOutOfRange. Какое из следующих действий вы считаете лучшим?

/// <exception cref="IndexOutOfRangeException">if index is less than 0
/// or greater than <see cref="Count"/>
public T this[int index] { get { return myArray[index]; } }

Или

/// <exception cref="IndexOutOfRangeException">if index outside the valid range
/// for an array of length equal to <see cref="Count"/></exception>
public T this[int index] { get { return myArray[index]; } }

Я имею в виду случай, когда этот класс будет использоваться из языка .NET, который индексирует массивы, начиная с 1. Я не очень разбираюсь в теме, но лучше ли вторая версия, чем первая?

Ответы [ 4 ]

1 голос
/ 20 декабря 2008

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

Редактировать: если вам действительно нужен массив внутри, как насчет , сначала поместив его в список внутри метода доступа , а затем выбрав по индексу. Таким образом, перевод из списка в индекс массива происходит на языке вашего компонента, а не на языке вызывающего.

Предположительно, семантика индексации списков не меняется в разных языках .Net? Именно этому должен следовать ваш компонент, поскольку он реализует интерфейс списка.

Снова отредактируйте: на самом деле, это вообще проблема ??

Люди получают доступ к вашему массиву через средство доступа, написанное на языке, которым вы управляете, и поэтому знают, с чего начинается индексация массива. Даже если вы вызываете свой (скажем) класс C # из вызывающей стороны VB.Net, средство доступа все равно будет использовать идею индексов массива в C #, не так ли?

0 голосов
/ 20 декабря 2008

В качестве отступления - вы всегда можете просто наследовать от Collection<T> в качестве отправной точки ... это обеспечивает необработанный код, позволяя вам настраивать вещи. Вы можете наследовать от List<T>, но, в отличие от Collection<T>, в List<T>.

нет никаких полезных virtual методов.
0 голосов
/ 20 декабря 2008

IList уже документов исключение (ArgumentOutOfRangeException, а не IndexOutOfRangeException). Если вы реализуете интерфейс и не меняете документированное поведение, зачем вам его документировать? Если вы собираетесь документировать его вообще, он должен согласиться с интерфейсом.

РЕДАКТИРОВАТЬ: Только что заметил вашу реализацию (или, по крайней мере, последствия, назвав вашу реализацию). Я согласен с @Dan, вы должны основывать его на List вместо массива, чтобы реализация соответствовала интерфейсу. При этом условии нет необходимости повторно документировать исключение. Если вы не измените базовую реализацию, вам следует перехватить исключение IndexOutOfRangeException и сопоставить его с исключением ArgumentOutOfRangeException, задокументированным интерфейсом.

0 голосов
/ 20 декабря 2008

Возможно ли, что у вас также может быть свойство "Base", тогда вы можете сказать:

/// <exception cref="IndexOutOfRangeException">if index is less than <see cref="Base" />

Если вы не можете иметь свойство Base, тогда вторая версия лучше, если вы должны быть осторожны с массивами на основе 1.

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