将委托[]传递给方法
本文关键字:方法 | 更新日期: 2023-09-27 18:01:47
我试图解构一个由另一个编码器编写的方法,看看它是如何工作的,但它变得有点混乱
我们有一个以Action作为参数的Delegate。
private delegate void FunctionDelegate(Action next);
然后在构造函数中调用一个函数,该函数以这些委托的数组作为参数,并执行数组中的每个值
LoadInSeries(LoadRoleAreaHours, LoadTableData);
函数是这样的
private void LoadInSeries(params FunctionDelegate[] _delegates)
{
var Delegates = new List<FunctionDelegate>(_delegates);
Func<Action, Action> creator = null;
creator = delegate(Action inner)
{
if (Delegates.Count > 0)
{
FunctionDelegate L = Delegates.First();
Delegates.RemoveAt(0);
Action next = delegate { L(inner); };
return creator(next);
}
else return inner;
};
Action outer = creator(null);
if (outer != null)
outer();
}
目的是将一系列函数链在一起,每个函数调用下一个函数,但使用多播委托并将每个函数添加到调用列表中不是很容易吗?
这段代码做了什么不同的事情吗?
如果没有一个好的最小化、完整和可验证的代码示例,就不可能完全理解代码。最值得关注的是,您的代码示例包含一个神秘的L()
方法,其行为我们不知道。FunctionDelegate = Delegates.First();
语句也有问题。FunctionDelegate
标识符充其量是指一个类字段或属性;在最坏的情况下,该语句甚至无法编译。无论哪种方式,都没有证据表明从输入列表中删除的委托对象曾经被实际调用过。
因此,为了回答这个问题,必须做出一些基本的假设,这些假设可能是正确的,也可能是不正确的。
也就是说,在最好的情况下—那就是代码在L()
方法中隐藏了一些可怕的,复杂的机制,最终能够调用当前调用creator
委托的委托—您正在查看的代码不是简单地按顺序调用委托,就像MulticastDelegate
的情况一样。相反,代码正在构造对L()
方法的调用链,按顺序将每个委托实例传递给该方法。
由于您没有向我们展示L()
方法,因此无法说明代码实际做了什么。我同意,如果所有L()
所做的只是调用您传递给它的委托,那么这段代码看起来像是一个非常复杂的方式,只是调用一个委托数组。但是,对编写代码的人来说,这只是意味着L()
可能做了一些事情,而不是简单地调用委托。
当然,有可能代码的作者不值得怀疑。在这种情况下,不仅使用多播委托更简单,而且最简单的实现只需遍历数组,按所需的顺序调用每个委托。但我这么说的时候并没有真正了解代码的作用。我只是假设它打算对传递给它的委托做一些有用的事情。在你发布的代码中,甚至没有证据支持这个慷慨的假设。
给我们完整的画面,可以提供一个更明确的答案。如果不知道L()
是什么,或者传入委托的目标方法中可能存在什么副作用,就不可能确定您正在查看的代码是否真的需要这样编写。