调用函数而不绑定标识符意味着什么

时间:2014-03-24 17:02:11

标签: c# multithreading lambda

我理解Lambda表达式的含义:

    delegate int del(int i);
    static void Main()
    {
        del myDelegate = x => x * x;
        int j = myDelegate(2);
        Console.WriteLine(j);
        Console.ReadLine();
    }

它实际上非常整洁,我会再次使用它,但是我读到了这个:

    static void Main()
    {
        Thread t = new Thread(() => Print("Hello from t!"));
        t.Start();
        Console.ReadKey();
    }

    static void Print(string message)
    {
        Console.WriteLine(message);
    }

我无法弄清楚() =>的意思,在谷歌上搜索后我发现我(根据维基百科)使用的是一个未定义(?)和/或不绑定的匿名函数标识符

现在,我问这是什么意思?我甚至做了我刚才所说的话吗?

3 个答案:

答案 0 :(得分:1)

这意味着它是一个没有任何参数的匿名函数(lambda表达式)。通常你需要一个lambda的参数来做它的事情。但是,如果您不需要任何参数,例如在Print语句中,则可以使用空参数集调用它。当你意识到当你只有一个参数时,括号是可选的更有意义。但是如果有多个参数或没有参数,则需要它们。

即:

(foo, bar) => foo.X + bar.y

() => DoSomething()

答案 1 :(得分:0)

()表示该方法的输入参数为零。

所以第二个例子与:

相同
static void Main()
{
    Thread t = new Thread(Foo);
    t.Start();
    Console.ReadKey();
}

static void Foo()
{
    Print("Hello from t!");
}

static void Print(string message)
{
    Console.WriteLine(message);
}

所以在第一个例子中x => x * x;相当于(x) => x * x,这意味着这个匿名方法有1个输入参数。

答案 2 :(得分:0)

() =>是lambda表达式的开头,它没有任何参数。重要的是要理解lambda表达式不能存在于真空中 - 它始终是转换为委托类型或表达式树类型的一部分。

在这种情况下,这被用作Thread constructor的参数。

如果查看线程构造函数,则有四个重载,其中两个具有单个参数。一个采用ThreadStart参数,另一个采用ParameterizedThreadStart参数。这些都是委托类型,但ParameterizedThreadStart有一个参数,而ThreadStart没有。

因此,从无参数的lambda表达式到ThreadStart的隐式转换,而不是ParameterizedThreadStart的转换,因此它将调用带有ThreadStart的重载。

所以它相当于:

ThreadStart tmp = () => Print("Hello from t!");
Thread t = new Thread(tmp);

要使用ParameterizedThreadStart,有三个选项:

// x is inferred to be type object
ParameterizedThreadStart tmp = x => Print("Hello from t!");
// The same, but with brackets around the parameter
ParameterizedThreadStart tmp = (x) => Print("Hello from t!");
// Fully explicit parameter list
ParameterizedThreadStart tmp = (object x) => Print("Hello from t!");

(同样,这些可以内联到Thread构造函数调用中,编译器会推断出构造函数的用途。)