这个C#代码使用的概念叫什么?它是如何工作的?

3

我在 MSDN 网站上查看了有关 RegisterWaitForSingleObject 的信息,详情请见此处。在示例中,我发现了下面这个用法 -

    ti.Handle = ThreadPool.RegisterWaitForSingleObject(
            ev,
            new WaitOrTimerCallback(WaitProc),
            ti,
            1000,
            false
        );

其中WaitProc是一个方法 -

    public static void WaitProc(object state, bool timedOut)
    {
     //Code
    }

我发现了一些例子,可以通过将WaitProc方法替换为类似以下内容的方法来实现相同的效果 -
    ti.Handle = ThreadPool.RegisterWaitForSingleObject(
            ev,
            (state, timedOut) => {
            //code blah blah
            //manipulate state
            //manipulate timedOut
            }
            ti,
            1000,
            false
        );

这里我假定方法RegisterWaitForSingleObject需要一个WaitOrTimerCallback方法,并且编译器理解这个并将(state, timedOut)视为一个方法,因此变量可以在调用中使用。
这个概念叫什么?
它是如何工作的?

2
这被称为lambda表达式 - Cameron
它被称为Lambda表达式,如果您对此不熟悉,您可能应该先查看匿名方法以充分掌握语法,然后再查看Lambda表达式。 - terrybozzio
1个回答

4

这个概念叫什么?

它是如何工作的?

它被称为Lambda表达式。编译器会将表达式转换成一个命名方法,而无需每次都定义一个与委托签名匹配的命名方法。

使用TryRoslyn,这是您的委托在新的Roslyn编译器上编译成的结果:
private sealed class <>c
{
    public static readonly C.<>c <>9;
    public static WaitOrTimerCallback <>9__0_0;
    static <>c()
    {
        // Note: this type is marked as 'beforefieldinit'.
        C.<>c.<>9 = new C.<>c();
    }
    internal void <M>b__0_0(object state, bool timedOut)
    {
    }
}

public void M()
{
    Mutex mutex = new Mutex();
    WaitHandle arg_2E_0 = mutex;
    WaitOrTimerCallback arg_2E_1;
    if (arg_2E_1 = C.<>c.<>9__0_0 == null)
    {
        arg_2E_1 = C.<>c.<>9__0_0 = new WaitOrTimerCallback(C.<>c.<>9.<M>b__0_0);
    }
    RegisteredWaitHandle registeredWaitHandle = 
        ThreadPool.RegisterWaitForSingleObject(arg_2E_0, arg_2E_1, null, 1000, false);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接