我目前正在开展一个有很多课程的朋友项目,由不同的人编写。在阅读代码时,我意识到这些人在特殊情况下抛出异常会有不同的风格。
只要说“开发者1”就行了:
public string this[int index]
{
get
{
if (index >= 0 && index < contents.Length)
return contents[index];
else
throw new IndexOutOfRangeException();
}
}
如果索引超出范围,他会检查索引并抛出异常。
“开发者2”改为:
public string this[int index]
{
get
{
return contents[index];
}
}
他不检查索引并让CLR抛出 - 如果索引超出范围,则抛出IndexOutOfRangeException。
当然,两种方式都会给出相同的结果,但是性能上有什么不同吗?还有什么建议可以使用吗? 我更喜欢第一种方式,因为它更容易维护..
答案 0 :(得分:3)
在我看来,第一种方式只是不必要的代码,我不会在这里看到任何维护收益。如果我们不想通过一些额外的细节抛出我们自己的异常,这种方式将是有用的。但是做同样的检查CLR会做出同样的例外 - 完全没有任何意义。
答案 1 :(得分:0)
在性能方面,支持数组已经在索引范围内运行检查,所以如果你自己做这个并不打算在抛出的异常中提供额外的细节,那么你只需复制一些会影响某些性能的工作。可能是不明显的方式。您可以设置一个控制台应用程序,使用Stopwatch比较性能,并运行每种样式几百万次并比较时间。
如果无法保证支持可枚举类型始终保持不变,那么自行检查和抛弃自己的潜在效用就是这样。正如Ron指出的那样,一个Dictionary会抛出一些不同的东西,所以如果调用者只有一个用于IndexOutOfRangeException的捕获,但在这种情况下,你的索引器可能正在持有一个Dictionary,如果你没有,你就不会处理异常“通过自己扔它来规范化它。