我在C#编码,我有一个类型为List< List< T>>的属性的类。在构造函数中初始化。代码如下:
public class MyMatrix<T>
{
private readonly List<List<T>> matrix;
public MyMatrix(int dimension)
{
this.matrix = new List<List<T>>();
for (int i = 0; i < dimension; i++)
{
List<T> subList = new List<T>();
this.matrix.Add(subList);
}
}
.....
问题是,如果我创建MyMatrix类型的新对象,则子列表为空,因此如果我调用类的ToString()方法或返回子列表中包含的值的任何其他方法,我会得到OutOfOrder异常预期。 Get和Set方法如下:
public T Get(int row, int column)
{
return this.matrix[row][column];
}
public void Set(int row, int column, T value)
{
this.matrix[row].Insert(column, value);
}
如果我使用Set方法初始化子列表,那么一切都很好。 我无法更改构造函数,因为由类的用户来初始化子列表因此不可能事先知道它们将包含什么。 你如何管理类方法中的异常,或者你会烦恼吗?
答案 0 :(得分:1)
在您的案例中有几种管理异常的方法,这取决于您希望如何使用矩阵类:
如果您希望用户在不初始化行/列的情况下设置值,那么在Set方法中,如果需要,我只需调整列表大小以容纳行/列参数。您始终可以使用default(T)
在列表中插入空项(这适用于值和引用对象)。在这种情况下,Get方法应检查矩阵坐标是否存在,否则返回default(T)
,以便不会发生异常。
如果您希望用户始终初始化矩阵,那么只需将其保留原样并抛出异常即可。这是一个明确的暗示,即应用程序行为不端,程序员必须处理这个问题。
如果您尝试实施Sparse Matrix之类的内容,那么使用List<T>
并不是最好的方法,您应该尝试其他方法 - 例如使用Dictionary<int, Dictionary<int, T>>
或某些方法一种链表。无论如何,在这种情况下,如果你采用词典方法,你仍然需要采取与上面相同的决定(即,如果访问不存在的坐标,则抛出或只返回default(T)
)