【发布时间】:2016-08-11 07:00:24
【问题描述】:
我正在尝试解构另一个编码员编写的方法,以查看它是如何工作的,但它变得有点混乱
我们有一个将 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();
}
意图过于链接一系列函数,每个函数调用下一个函数,但使用多播委托并将每个函数添加到调用列表中并不容易。
这段代码有什么不同吗?
【问题讨论】:
-
这真的有效吗?如果是这样,它仍然只是模拟多播委托的一种不必要的复杂和昂贵的方式。此外,尽量避免函数式代码中的变异状态——这是很难找到和修复的错误的重要来源。哎呀,即使是对代表的简单迭代也会比你现在拥有的更好。并且不要忘记您可以对匿名函数使用 lambda 语法 -
inner => { ... }而不是delegate(Action inner) { ... }。 -
@Luaan 它可以工作,但它所做的只是调用一系列函数,我们通常通过创建一个函数来调用这些方法。
标签: c# lambda delegates anonymous-function