首页 > 解决方案 > C# 中输出参数的良好做法

问题描述

我一直是 C/C++ 程序员和 C# 新手。

我想从一个函数中返回多个参数以及状态,所以我想将它们用作输出参数。这是一个例子。

bool SomeFunction(string inStr, out string outStr)
{
    if (someCondition)
    {
        outStr = AnotherFunction(inStr);
        return true;
    }
    return false;
}

我只想根据某些条件而不总是设置 outStr 的值。但是,它不能编译,我必须用一些值初始化 outStr,如下所示。

bool SomeFunction(string inStr, out string outStr)
{
    outStr = string.Empty; // this makes it compile
    if (someCondition)
    {
        outStr = AnotherFunction(inStr);
        return true;
    }
    return false;
}

如果某些条件失败,我希望不初始化它。在这种情况下,我想在不初始化的情况下返回错误。我知道关键字 ref 代替 out 是可能的,而且我知道 ref 和 out 之间的区别。在这种用例中使用 ref 是一种好习惯吗?函数中输出参数的最佳实践是什么。提前致谢!

标签: c#

解决方案


C# 社区对out参数的分歧很小,通常是因为一个好的签名是带有尽可能少的参数的签名,并且 out 参数总是可以转换为返回的类型。

但有时它们很有用,仍然可以创建好看的代码。

我的最佳实践:

  • 输出参数总是被初始化。如果TryGetorTryParse函数的结果为 false,则用户不应使用out内容。
  • 在这些情况下,属性会派上用场,如果您想将out参数保留为 null 并且希望编译器帮助您:(bool TryGetMessage(string key, [NotNullWhen(true)] out string? message)更多信息在这里
  • 如果您有超过 1 个输出参数,或者如果函数比您发布的更复杂,请返回一个对象。它更易于维护、阅读和测试。
  • 如果一个对象看起来太多的承诺(也许它只会被使用一次),你可以使用一个元组。但是不要过度使用它们,可读性可能会受到影响。
  • bool+out模式是普遍认可的。如果您想用它“返回错误”,也许这不是您要寻找的东西(GetXOrThrow()可能是您要寻找的东西)。
  • 我不会ref在你的情况下使用。当您希望将值作为副作用进行修改时,请使用 ref。在这种情况下,outStr绝对是一个新变量。

推荐阅读