繁体   English   中英

C# 中何时使用 Try 模式的最佳实践

[英]Best practices for when to use the Try pattern in C#

在阅读了一些关于该主题的内容后,我仍然不确定何时提供 TryGet*(someParameter, out someValue) 方法。 我理解当存在可以在失败的情况下抛出异常的方法的变体时它是如何有用的,但是我不能真正形成一个通用规则来帮助我决定何时提供任何一种方法.

对此想到的一些问题:

  • 为什么不让非尝试方法不抛出异常?
  • 什么时候抛出异常比只返回 null 更好?
  • 如果决定归结为使用一种仅返回可空类型(或某些 Result 类型)的方法,是否应该始终反映在方法名称中,因为它必须以“Try”为前缀?
  • 在每种情况下都提供两种类型的方法总是更好吗?

我专门处理一个集合,我有一堆方法,比如: void GetAt(position) bool TryGetAt(position, out item)

我不确定这是否需要,但感觉我正在做的事情在某种程度上是错误的。

TryParse模式不(只是)关于防止异常。 这是一种向调用者显示输入可能无效并且他/她可以相应地处理false情况的方法。 所以你从方法中得到两个信息:

  1. 解析/解析的值,以防它成功
  2. 一个bool ,指示该值是否可以成功解析

请注意,您无法从值本身获取第二个信息,因为无论您在false情况下从方法返回什么,它都可能是有效值。

TryParse模式的唯一缺点,即返回一个bool值和作为out参数的值,是您不能将它与其他方法调用“链接”。 这就是为什么我有时会在解析原始类型时提供不同的方式: return Nullable<T>

public static class StringExtensions
{
    public static int? TryGetInt(this string input)
    {
        return int.TryParse(input, out int value) ? value : new int?();
    }
    // more methods like this...
}

为什么不让非尝试方法不抛出异常?

因为通常你不能这样做,因为异常不是来自你的代码。 但正如我所说,这不是为了防止异常,而是为了帮助方法的调用者理解它并处理结果。

什么时候抛出异常比只返回 null 更好?

在不正常程序流程的异常情况下。 但不是返回null你应该返回一个bool (try-get with out -parameter)或一个可为空的类型(原始类型)。

如果决定归结为使用一种仅返回可空类型(或某些 Result 类型)的方法,是否应该始终反映在方法名称中,因为它必须以“Try”为前缀?

是的,这将有助于理解该方法在成功时也会返回信息。

在每种情况下都提供两种类型的方法总是更好吗?

不,那只是迷惑人,应该使用什么方法?!

我专门处理一个集合,我有一堆方法,比如: void GetAt(position) bool TryGet(position, out item)

听起来像是TryGet的合理用例,但不要同时提供两者。 但是,您没有提供足够的信息。

对我来说, Try Pattern 开始发挥作用,当它经常发生时,你没有匹配并且不是例外。

因此,根据您的具体情况,您的 class 被要求提供它无法提供的东西的可能性有多大? 更重要的是,在这种情况下能做些什么呢? 调用者是否可以做一些简单的事情(例如调用其他一些Try -Method,回退到其他东西)或者使用无效的参数值调用您的方法确实是异常的事情,您所能做的就是抛出异常以摆脱整个堆栈?

根据每个案例中上述问题的答案,我决定通往 go 的路线。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM