使用未处理的异常而不是Contains()?

gor*_*ric 7 .net c# error-handling

想象一下,您正在使用的对象具有与其关联的其他对象的集合,例如,WinForm上的Controls集合.您想要检查集合中的某个对象,但该集合没有Contains()方法.有几种方法可以解决这个问题.

  • Contains()通过循环遍历集合中的所有项来实现您自己的方法,以查看其中一个是否是您正在寻找的.这似乎是"最佳实践"方法.
  • 我最近遇到了一些代码,而不是循环,尝试访问try语句中的对象,如下所示:
try  
{  
    Object aObject = myCollection[myObject];  
}  
catch(Exception e)  
{  
    //if this is thrown, then the object doesn't exist in the collection
}
Run Code Online (Sandbox Code Playgroud)

我的问题是你认为第二种选择的编程习惯有多差,为什么?它的性能与集合中的循环相比如何?

lom*_*axx 3

我不得不说这是非常糟糕的做法。虽然有些人可能会很高兴地说循环遍历集合对于抛出异常来说效率较低,但抛出异常是有开销的。我还想问,当您更适合使用字典或哈希表时,为什么要使用集合来按键访问项目。

然而,这段代码的主要问题是,无论抛出何种类型的异常,您总是会得到相同的结果。

例如,可能会引发异常,因为集合中不存在该对象,或者因为集合本身为 null,或者因为无法将 myCollect[myObject] 转换为 aObject。

所有这些异常都将以相同的方式处理,这可能不是您的意图。

以下是几篇关于何时何地通常认为可以接受抛出异常的好文章:

我特别喜欢第二篇文章中的这句话:

重要的是,仅当发生意外或无效活动导致方法无法完成其正常功能时,才会引发异常。异常处理会带来少量开销并降低性能,因此不应将其用于正常程序流,而应使用条件处理。以这种方式维护滥用异常处理的代码也可能很困难。