具有最佳性能的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;
    }
}

具有最佳性能的Foo/TryFoo方法对的设计

TryFoo() API模式的要点是避免(潜在地)抛出伴随的Foo函数所做的异常的开销。

您的第一个示例完成了这一点。还要注意,第一个示例中的模式是由Microsoft本身在其Boolean参考源代码中支持的。

最后,请注意代码分析将引发CA1021:如果在公共方法中包含out参数,则避免out参数。问题代码分析给出了不使用"out"参数的建议,讨论了这个警告。得票最多的答案表明,TryParse习语是行之有效的。因此,在公共API中使用TryParse方法很有可能受到欢迎。因此,在这种情况下,可以提出一个合理的(尽管是主观的)论点来抑制警告CA1021。


<一口>匕首;Damien_The_Unbeliever推荐的链接