具有最佳性能的Foo/TryFoo方法对的设计
本文关键字:方法 TryFoo Foo 最佳 性能 | 更新日期: 2023-09-27 18:16:53
我有一个常见的场景,需要编写一对方法:
- 获取结果并在失败时抛出异常,
- 相同方法的
Try
变体,它试图获得结果作为out
参数,并返回一个bool
,表示成功状态。
这里有两个例子来说明我正在考虑的两种方法。这些方法中哪一种提供了最好的性能?另外,是否一种方法比另一种更容易维护?我也愿意听取关于实现这对方法的其他方法的建议。
方法一:Foo()
作为主控
public string GetAnswer(string question) {
string answer = null;
if(!this.TryGetAnswer(question, out answer)) {
throw new AnswerNotFoundException();
}
return answer;
}
public bool TryGetAnswer(string question, out string answer) {
answer = null;
//business logic
return answer != null;
}
方法二:TryFoo()
作为主控
public string GetAnswer(string question) {
//business logic
if(!answerFound) {
throw new AnswerNotFoundException();
}
return answer;
}
public bool TryGetAnswer(string question, out string answer) {
try {
answer = this.GetAnswer(question);
return true;
} catch (AnswerNotFoundException e) {
answer = null;
return false;
}
}
TryFoo()
API模式的要点是避免(潜在地)抛出伴随的Foo
函数所做的异常的开销。
您的第一个示例完成了这一点。还要注意,第一个示例中的模式是由Microsoft本身在其Boolean参考源代码中支持的。
最后,请注意代码分析将引发CA1021:如果在公共方法中包含out
参数,则避免out参数。问题代码分析给出了不使用"out"参数的建议,讨论了这个警告。得票最多的答案表明,TryParse
习语是行之有效的。因此,在公共API中使用TryParse
方法很有可能受到欢迎。因此,在这种情况下,可以提出一个合理的(尽管是主观的)论点来抑制警告CA1021。
<一口>匕首;Damien_The_Unbeliever推荐的链接一口>