我正在尝试解构另一个编码器编写的方法,看看它是如何工作的,但它有点令人困惑
我们有一个代理,它将Action作为参数。
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();
}
意图过于链接一系列函数,每个函数调用下一个函数,但不容易使用多播委托并将每个函数添加到调用列表。
此代码是否有不同之处?
答案 0 :(得分:1)
如果没有好的Minimal, Complete, and Verifiable code example,就无法完全理解代码。最重要的是你的代码示例包含一个神秘的
FROM ubuntu:14.04
MAINTAINER Rune Langoy "rune@something.com"
RUN apt-get update
CMD tail -F -n0 /etc/hosts
方法,我们不知道它的行为。 L()
语句也存在问题。充其量,FunctionDelegate = Delegates.First();
标识符指的是类字段或属性;在最坏的情况下,该声明甚至不会编译。无论哪种方式,都没有证据表明从输入列表中删除的委托对象实际上是被实际调用的。
所以,即使回答这个问题,也必须做出一些基本的假设,这些假设可能也可能不正确。
那就是说,在最好的情况下 - 代码隐藏了FunctionDelegate
方法中的一些可怕的,错综复杂的机制,最终结束时能够调用当前调用{{{}的委托。 1}}委托 - 您正在查看的代码不是简单地按顺序调用委托,就像L()
的情况一样。相反,代码正在构建一个对creator
方法的调用链,将每个委托实例按顺序传递给该方法。
由于您没有向我们展示MulticastDelegate
方法,因此无法说明代码实际执行的 。我同意如果L()
所做的只是调用你传递给它的委托,那么这段代码看起来就像一个非常复杂的方式来调用一个委托数组。但是,给编写代码的人带来疑问,这只是意味着L()
可能做的事情不仅仅是调用委托。
当然,代码的作者可能不应该受到怀疑的好处。在这种情况下,不仅仅使用多播委托更简单,最简单的实现将迭代数组,以所需的顺序调用每个委托。但我说的是,在不知道代码的作用的情况下。我只是假设它打算对传递给它的代表做一些有用的事情。您发布的代码中没有任何证据支持这种慷慨的假设。
向我们提供完整的图片,并提供更明确的答案。不知道L()
是什么,或传入的代表可能存在哪些副作用&#39;目标方法,无法确定您正在查看的代码是否真的需要以这种方式编写。