我有一个调用函数的代码,直到满足条件,但我不是处于非常提前的阶段所以代码,我一点也不清楚。在这里,我将提交我得到的代码......请有人讨论代码如何工作。
public static void RunToFirstMatch<T>(Func<T, bool> sentry, params Func<T>[] functions)
{
functions.Any(f => match(f()));
}
代码调用如下
RunToFirstMatch(v => (v >= 5), Step1, ()=>Step2(1,1), Step3, Step4, ()=>0+1);
RunToFirstMatch 函数取2参数但是当这个函数被调用时,许多参数正在传递....我只是不了解函数的调用。请讨论谢谢。
答案 0 :(得分:5)
这有几个部分,我可以看到为什么新手可能会发现这个代码有点难以理解。
首先,该方法不使用2个参数,第二个标记为params
,这意味着将任意数量的参数传递给此方法,除了第一个参数之外的所有参数都作为数组发送到参数{ {1}}(进一步阅读the C# params
keyword)。
接下来,该方法使用functions
扩展方法IEnumerable<T>
枚举任何可枚举(例如参数Any
),直到其中一个方法返回true。
我认为你有一些参数混淆了,我认为你已经将functions
更改为sentry
,并且假设发生的事情是数组match
中的每个函数都是执行,结果传递给functions
函数(返回true或false)。第一个返回true,方法退出。
通过一个例子,大致基于你自己:
match
步骤1,2&amp; 3将执行(3是第一个返回false),然而4&amp; 5不会。
答案 1 :(得分:3)
我认为代码中存在轻微错误,因为我认为它应该是
public static void RunToFirstMatch<T>(Func<T, bool> sentry, params Func<T>[] functions)
{
functions.Any(f => sentry(f()));
}
但让我们一步一步走:
sentry是一个谓词,根据它的输入(类型为T)决定是否为真 - 这是你给函数的第一件事 - 在你的例子中这是v >= 5
- 所以我想它会拿一个int(从你的例子中不清楚 - 例如也可以是双倍)并检查它是否更大5
接下来你有了一个 param array 函数,每个函数都给你一个T param数组是你可以提供多个函数的原因。
Any是一个很好的技巧:这将通过你提供的函数(在param数组中),对它们进行评估,然后用哨兵检查结果。如果哨兵说真的任何停止,那么这个功能完全按照它说的那样。
答案 2 :(得分:2)
第二个参数params Func<T>[] functions
实际上意味着“允许许多Func<T>
作为后续参数传递,并将它们呈现在一个名为functions
的数组中。”这是由params keyword。
因此,当你打电话
RunToFirstMatch(v => (v >= 5), Step1, ()=>Step2(1,1), Step3, Step4, ()=>0+1)
你得到了
sentry = v => (v >= 5); /* or should this be called match? */
functions = new Func<T>[]
{
Step1,
()=>Step2(1,1),
Step3,
Step4,
()=>0+1
};