想象一下一个对象你的工作与具有收集的其他目的与其相关联,例如,控制集合在一WinForm.你想要检查一个特定目的收集,但是收集没有 Contains() 法。有几种方式处理这个。

  • 实现你自己的 Contains() 方法的循环集合中的所有项目,看看如果他们中的一个就是你所寻找的。这似乎是"最佳做法"的方法。
  • 我最近遇到了一些代码,而不是一个循环中,没有试图访问的对象内的一个尝试的发言,如下:
try  
{  
    Object aObject = myCollection[myObject];  
}  
catch(Exception e)  
{  
    //if this is thrown, then the object doesn't exist in the collection
}

我的问题是多么可怜的一种编程的实践做你考虑的第二个选项是,为什么?是怎样的性能,它比作一个循环的集合?

有帮助吗?

解决方案

我必须说,这是非常糟糕的做法。虽然有些人可能会高兴地说,循环,通过收集效率较低,对投掷的一个例外,有一个顶投掷的一个例外。我还要问为什么您使用的是集合访问的一项关键时你会更适合于使用的字典或hashtable.

我的主要问题与这个代码然而,无论是何种类型的例外抛出,你总是会被留下了同样的结果。

例如,一个例外可能是引发,因为对象不存在收集的,或者是因为收集本身是空的或者是因为你不能投myCollect[myObject]以aObject.

所有这些例外会得到的处理方法相同,这可能不是你的意图。

这些都是几个不错的文章上的时候,在功能被认为是可接受的抛出例外规定:

我特别喜欢这句话,从第二条:

重要的是,例外的是 扔只有当一个意想不到或 无效的活动,防止发生 一种方法完成其正常 功能。例外处理 引入了一个小小的开销和降低 性能,因此不应该被用于 正常的程序流程,而不是的 有条件的处理。它也可以 难以维持的代码 滥用例外处理在这 方式。

其他提示

一般的经验法则是要避免使用的例外情况的控制流程,除非情况下,将触发例外是"特殊"--例如,极为罕见!

如果这是什么,会发生通常和定期就绝对不应该处理作为一个例外。

例外情况是非常、非常缓慢的,因为所有的开销,所以有可能的原因,以及,如果它发生的事情往往不够。

如果,同时编写代码,你希望这个对象是在集合,然后在运行期间你找它不,我会打电话,一个特殊的情况下,这是适当使用一个例外。

但是,如果你只是测试是否存在一个对象,你会发现它是不存在的,这不是特殊的。使用一个例外在这种情况下是不适当的。

分析的运行性能取决于实际收集是用,并且该方法,如果寻找它。这不应该的问题。不要让幻觉最优化傻瓜你写入混乱的代码。

我会考虑更为我有多喜欢它...我的直觉是,呃,没有这么多...

编辑:瑞恩*福克斯的意见,在特殊情况下是完美的,我同意

作为性能,这取决于索引器的收集。C#可以让你重写索引器操作员,因此,如果它是这样做的一个循环喜欢的包含的方法,你会写,然后它将只是缓慢(也许有几毫微秒的速度较慢,由于该试试/赶上...但没什么好担心的除非那个代码本身是内的一个巨大的循环)。

如果indexer is O(1)(甚至O(日志(n))的...或任何事情的速度比O(n)),然后试图/赶上的解决方案将会更快的课程。

此外,我假设indexer投掷的例外,如果是返回null,你可以当然只是检查空和不使用的尝试/赶上。

在一般情况下,使用异常的处理程序流程和逻辑是不好的做法。我个人觉得,后一种选择是不可接受的使用的例外情况。鉴于特征的语言通常使用的这些天(例如皇宫和lambda在C#例如)没有理由不写你自己包含()方法。

作为一个最后的想法,这些天数收藏品 有一个包含的方法。因此,我认为在大多数情况下这是一个非的问题。

例外情况应该是例外。

类似'的收集丢失,因为该数据库已经下降,从下面这是特殊的

类似'的关键是不存在的'正常行为的一个典。

对于您的具体例子它控制的集合, Controls 酒店有一个 ContainsKey 方法,这是什么你应该使用。

有没有 ContainsValue 因为当处理字典/hashtables,没有快速的方式短期的迭代过整个集的检查,如果东西是存在的,所以你真的不鼓励这样做。

为什么例外情况应该是例外,它是约2的事情

  1. 指示你的代码是试图做到的。你想要有你的代码相匹配它是什么努力来实现,尽可能密切,因此它是可读的,并可维护。处理异常增加了一堆规矩的东西它的方式得到这个目的

  2. 简洁的目的代码。你想要你的代码做什么这样做在最直接的方式,因此它是可读的,并可维护。再次,令人讨厌的加入例外处理的方式获得这一点。

看看这篇文章从Krzystof: http://blogs.msdn.com/kcwalina/archive/2008/07/17/ExceptionalError.aspx

例外情况应当使用通信的错误的条件,但他们不应该被用来作为控制逻辑(尤其是当有更简单的方法来确定条件,例如包含).

一部分问题是例外,而不是昂贵 很昂贵 抓住 和所有异常被夹在一些点。

后者是一个可以接受的解决方案。虽然我肯定会赶上的特定例外(ElementNotFound?) 收集投掷在这种情况。

Speedwise,它取决于公共的情况。如果你更有可能找到的元素比不,异常的解决方案将会更快。如果你更有可能失败了,然后它将取决于集合的大小和其迭代的速度。不管怎样,你想要措施对正常使用来看,如果这实际上是一个瓶颈之前令人担忧的速度这样的。去为了清楚起见第一,而后者解决方案是更加清晰于前者。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top