考虑一个具有重载索引器的二维 Matrix 类,如下所示:
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 异常?