c# - 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# 社区对out参数的分歧很小,通常是因为一个好的签名是带有尽可能少的参数的签名,并且 out 参数总是可以转换为返回的类型。
但有时它们很有用,仍然可以创建好看的代码。
我的最佳实践:
- 输出参数总是被初始化。如果
TryGet
orTryParse
函数的结果为 false,则用户不应使用out内容。 - 在这些情况下,属性会派上用场,如果您想将out参数保留为 null 并且希望编译器帮助您:(
bool TryGetMessage(string key, [NotNullWhen(true)] out string? message)
更多信息在这里) - 如果您有超过 1 个输出参数,或者如果函数比您发布的更复杂,请返回一个对象。它更易于维护、阅读和测试。
- 如果一个对象看起来太多的承诺(也许它只会被使用一次),你可以使用一个元组。但是不要过度使用它们,可读性可能会受到影响。
bool
+out
模式是普遍认可的。如果您想用它“返回错误”,也许这不是您要寻找的东西(GetXOrThrow()
可能是您要寻找的东西)。- 我不会
ref
在你的情况下使用。当您希望将值作为副作用进行修改时,请使用 ref。在这种情况下,outStr
绝对是一个新变量。
推荐阅读
- guidewire - 忘记 Guidewire 产品设计师密码
- java - 当它在另一个类中时如何从 AsyncTask 获取值
- angular - 业力打字.d.ts
- perl - Perl 在@INC 中找不到.pm
- intellij-idea - WebStorm 运行配置 - package.json 相对于项目目录的路径
- javascript - Jquery:如何使用 jQuery 在输入文本字段中只允许带逗号的数字/浮点数(即使复制粘贴)?
- c# - C# / UWP / MVVM - 服务器不可访问时如何处理 HttpClient 异常
- django - django模板中的ifequal
- ionic-framework - 数据准备好后关闭 Ionic 4 加载(微调器)
- python - 如何加载加权拆分张量流数据集