c# - 方法中的参数位置 - 参数 VS CancellationToken
问题描述
params
应该是方法的最后一个参数 => 如果违反,编译器错误:
[CS0231] params 参数必须是形式参数列表中的最后一个参数
CancellationToken
应该是方法的最后一个参数 => 如果违规,警告 CA1068:CancellationToken 参数必须排在最后(https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1068) .
当我们拥有两者时,我们必须拥有修复编译错误的特权 - 将 CancellationToken 放在params
. 如果我们还有其他参数,最理想的 IMO 应该是:
TReturnType MyMethod(int num, string str, CancellationToken ct, params MyEnum[] myEnums);
这是正确的方法吗?
解决方案
取消标记参数必须在params
参数之前,否则无法编译。没有办法解决这个问题。
也就是说,有更好的方法。首先避免params
。我看到了几种方法。
多重重载
通常你会看到一个方法的多个重载,而不是使用params
. 这通常是出于性能原因,但在您的情况下,可以避免警告和错误。
这意味着您必须提前提出一个合理的数字,以及一个最终的重载,该重载包含一个数组或一个IEnumerable<>
.
TReturnType MyMethod(int num, string str, MyEnum first, CancellationToken ct);
TReturnType MyMethod(int num, string str, MyEnum first, MyEnum second, CancellationToken ct);
TReturnType MyMethod(int num, string str, MyEnum first, MyEnum second, MyEnum third, CancellationToken ct);
TReturnType MyMethod(int num, string str, MyEnum[] myEnums, CancellationToken ct);
// and/or
TReturnType MyMethod(int num, string str, IEnumerable<MyEnum> myEnums, CancellationToken ct);
标志
如果您的类型恰好是enum
考虑制作它Flags
。
[Flags]
public enum MyEnum
{
Red = 1, Green = 2, Blue = 4
};
然后您可以将方法的签名更改为
TReturnType MyMethod(int num, string str, MyEnum myEnums, CancellationToken ct);
并访问myEnums
使用HasFlag的各个标志。
推荐阅读
- javascript - 多功能框 addSuggest 如何在私密模式下工作?
- spring-boot - 将数据从 Thymeleaf 模板传递到 springboot 控制器
- r - 使用 R Shiny 中的操作按钮更新值框
- python - 怎样去掉内圆内和外圆外的线段?
- excel - 根据当前日期选择列的最佳方法(Excel VBA)
- linux - Linux 高 cpu 使用率 - htop 显示 90% 到 100% cpu 使用率
- sql - Apache NiFi:由 NOT NULL CONSTRAINT 导致的 INSERT 语句失败
- angular - Microsoft Teams Angular 应用程序,Sinon Stub `microsoftTeams.authentication.notifySuccess`
- c - C 使用系统调用创建一个 .PID 文件
- logstash - 如何在logstash输出中检查带有日期的索引