获取lambda以引用其自身

本文关键字:引用 lambda 获取 | 更新日期: 2023-09-27 18:22:02

我正试图使lambda能够引用自己,例如:

PictureBox pictureBox=...;
Request(() => {
    if (Form1.StaticImage==null)
        Request(thislambda); //What to change to the 'thislambda' variable?
    else
        pictureBox.Image=Form1.StaticImage; //When there's image, then just set it and quit requesting it again
});

当我试图将lambda放入变量中,而lambda引用了它自己时,当然是错误的。

我曾想过用一个能够调用自己的方法创建类,但我想坚持使用lambda。(到目前为止,它只提供了可读性,没有任何优势)

获取lambda以引用其自身

您需要声明委托,将其初始化为东西,这样您就不会访问未初始化的变量,然后用lambda初始化它。

Action action = null;
action = () => DoSomethingWithAction(action);

我看到的最常见的用法可能是当事件处理程序在触发时需要将自己从事件中移除时:

EventHandler handler = null;
handler = (s, args) =>
{
    DoStuff();
    something.SomeEvent -= handler;
};
something.SomeEvent += handler;

从C#7开始,您还可以使用本地函数:

PictureBox pictureBox=...;
void DoRequest() {
    if (Form1.StaticImage == null)
        Request(DoRequest);
    else
        pictureBox.Image = Form1.StaticImage; //When there's image, then just set it and quit requesting it again
}
Request(DoRequest);

这是专家们关于这个主题的一篇有趣的帖子-http://blogs.msdn.com/b/wesdyer/archive/2007/02/02/anonymous-recursion-in-c.aspx

文章节选-"一个快速的解决方法是将值null分配给fib,然后将lambda分配给fib.这会导致fib在使用之前被明确分配。

Func<int, int> fib = null;
fib = n => n > 1 ? fib(n - 1) + fib(n - 2) : n;
Console.WriteLine(fib(6)); // displays 8

但是我们的C#解决方法并没有真正使用递归。递归要求函数调用自己。"

如果你正在寻找其他有趣的方法,请阅读整篇文章。