我理解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);
}
我无法弄清楚() =>
的意思,在谷歌上搜索后我发现我(根据维基百科)使用的是一个未定义(?)和/或不绑定的匿名函数标识符
现在,我问这是什么意思?我甚至做了我刚才所说的话吗?
答案 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
构造函数调用中,编译器会推断出构造函数的用途。)