首页 > 解决方案 > 方法中的参数位置 - 参数 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);

这是正确的方法吗?

标签: c#

解决方案


取消标记参数必须在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的各个标志。


推荐阅读