【发布时间】:2014-04-29 22:44:29
【问题描述】:
我在我的库中添加了一个新类,它将成为公共文档 API 的一部分。底层数据结构是原生数组,虽然在第一次生成原生数组时使用了List<T>。
MSDN 指出List<T> 抛出ArgumentOutOfRangeException 而不是IndexOutOfRangeException(可以在访问本机数组时抛出)。
所以我计划更新我的函数以始终抛出 ArgumentOutOfRangeException 以在我记录的 API 中保持一致性,如下所示:
public class MyClass {
private int[] _values;
public int GetValue(int index) {
if (index < 0 || index >= _values.Length)
throw new ArgumentOutOfRangeException("index");
return _values[index];
}
}
我的问题是这样的:
上面的源代码会产生两个范围检查(我的一个 + 原生数组一个)还是 .NET 编译器足够聪明,可以删除 IndexOutOfRangeException 检查?
【问题讨论】:
-
何必呢?我同意他们不使用相同的异常很奇怪,甚至更奇怪的是
ArgumentOutOfRangeException的文本说索引超出范围,但我认为这不会增加很多价值。这些异常通常表示应该修复的程序错误。不应捕获和“处理”异常 -
@sircodesalot 将访问封装在
try...catch块中以捕获IndexOutOfRangeException并抛出ArgumentOutOfRangeException是否更有意义? -
@BrianRasmussen 我必须说这是一个很好的论点。如果您将其发布为答案,那么我会接受它:)
标签: .net mono il indexoutofrangeexception