我想知道,为什么Microsoft开发人员不向我们提供各种不可靠方法的"尝试"版本?
如果我使用数据库连接或smtp客户端,我总是必须考虑例外:
try { smtpClient.Send(message); } catch (SmtpException) { // test with real smtp server and analyze an exception and it's contents here }
但我想要的用户是:
if(!smtpClient.TrySend(message, out reason)) { // analyze reason here }
对我来说最大的问题是异常性能开销.我无法承担在我的服务的每个客户电话上抛出异常.如果我需要检查几十个连接/提供者,这可能会导致每个客户端请求有几十个例外.
我的问题是:.NET中这种API设计决策的基本原理是什么?我不认为这是一个错误,因为它无处不在,而不是单一的技术.
更新
我必须再给你一个.NET异常的例子来停止谈论网络延迟.例如,如果停止了Windows服务,则System.Diagnostics.EventLog.WriteEntry
可以抛出方法System.ComponentModel.Win32Exception
.
我想知道,为什么Microsoft开发人员不向我们提供各种不可靠方法的"尝试"版本?
由于我不是微软员工,我只能猜测.我的猜测是有两个原因:
在设计.NET类库的第一个版本时,他们没有想到它 - 请注意,这些TryParse
方法已在更高版本中添加.
性能差异不够重要(见下文),以保证实施和维护新Try...
方法的成本..NET Framework还需要更紧急的其他功能.
对我来说最大的问题是异常性能开销.
我非常怀疑.SMTP超时(=几秒)的"性能开销"主导了将异常(小于一毫秒)抛出超过1000倍的"性能开销".