创建可能抛出IndexOutOfRangeException的属性

Bri*_*ett 7 c# api-design

我有一个包含项目集合的类.为方便起见,我提供了由实现的GetCurrentItem

public Type GetCurrentItem
{
     get { return this.items[this.items.Count - 1]; }  
}
Run Code Online (Sandbox Code Playgroud)

如果列表中没有项目,则会抛出异常.

我应该抛出异常还是应该归还null?如果这是我递给你的API,你会期待什么?例外还是null?有没有更好的方法来处理这个?

Jam*_*are 9

至于哪个更正确?正如柯克的评论所暗示的那样:这取决于.有时a具有null逻辑意义,如果没有默认值是合理的,有时异常更适合.我尝试做的一件事是想到"是在称GetCurrentItem逻辑失败还是安全?"

如果没有时调用失败GetCurrentItem,则抛出异常是正确的过程.例如,如果您的集合有一个HasCurrentIsEmpty属性,有人可以在调用之前检查结果GetCurrentItem,那么他们应该"知道更好".但是,如果当前项目是null使用您的类的正确逻辑方式,那么无论如何都要设计它.无论哪种方式,我都会记录代码注释中的行为,以便让用户知道预期的行为.

我会这样说,暴露ArgumentOutOfRange异常可能会泄漏实现细节.也就是说,如果这个类的用户不知道内部结构是一个数组或者List<T>,那么不要将该异常流出,而是抓住它,包装它,并抛出一个更有意义的(自定义或类似的东西InvalidOperationException) .

由于他们并没有真正直接传递参数,他们获得ArgumentOutOfRange异常可能会令人困惑:-)