将委托[]传递给方法

本文关键字:方法 | 更新日期: 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()是什么,或者传入委托的目标方法中可能存在什么副作用,就不可能确定您正在查看的代码是否真的需要这样编写。