Рассмотрим двумерный класс Matrix, который имеет перегруженный индексатор, STH, как это:Проверка исключений в DTO - лучшая практика
public class Matrix
{
private readonly double[,] _matrix;
public double this[int i, int j]
{
get
{
return _matrix[i, j];
}
set
{
_matrix[i, j] = value;
}
}
public double this[int i, int j]
{
get
{
if (i < 0 || i >= _matrix.GetLength(0) || j < 0 || j >= _matrix.GetLength(1))
throw new IndexOutOfRangeException("index was out of range");
return _matrix[i, j];
}
set
{
if (i < 0 || i >= _matrix.GetLength(0) || j < 0 || j >= _matrix.GetLength(1))
throw new IndexOutOfRangeException("index was out of range");
_matrix[i, j] = value;
}
}
public double this[int i, int j]
{
get
{
if (i < 0 || i >= _matrix.GetLength(0) || j < 0 || j >= _matrix.GetLength(1))
return 0;
return _matrix[i, j];
}
set
{
if (i >= 0 || i < _matrix.GetLength(0) || j >= 0 || j < _matrix.GetLength(1))
_matrix[i, j] = value;
}
}
}
, как вы видите, есть 3 версии индексатор.
1) эта версия не проверяет индексирует
2) эта версия проверяет индексы, и если они из размеров бросить в IndexOutOfRangeException
3) эта версия проверяет индексы и правопреемников/возвращает значения только если индексы действительны.
Так что мой вопрос в том, какая из них лучше всего использовать? Что бы вы предпочли и почему? или я могу создать новое настраиваемое исключение, например «MatrixIndexOutOfRange», и выбросить его вместо исключения IndexOutOfRange?