调用一个没有绑定到标识符的函数是什么意思?
本文关键字:标识符 函数 是什么 意思 绑定 一个 调用 | 更新日期: 2023-09-27 17:53:14
我对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);
}
我不能完全弄清楚() =>
是什么意思,在谷歌后我发现我(根据维基百科)使用一个未定义的匿名函数(?)和/或不绑定到标识符。
现在,我问这是什么意思?我刚才说的对吗?
这意味着它是一个没有任何参数的匿名函数(lambda表达式)。通常你需要一个参数来处理它。但是,如果您不需要任何参数,比如在Print语句中,那么您可以使用空参数集调用它。当您意识到只有一个参数时,括号是可选的,这就更有意义了。但是对于多个参数,或者没有参数,您需要它们。
ie:(foo, bar) => foo.X + bar.y
或
() => DoSomething()
() =>
是没有任何参数的lambda表达式的开始。重要的是要理解lambda表达式不能存在于真空中——它总是转换为委托类型或表达式树类型的一部分。
在本例中,this被用作Thread
构造函数的参数。
如果你看一下线程构造函数,有四个重载,其中两个只有一个参数。一个取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
构造函数调用中,编译器将推断出使用的是哪个构造函数)
()
表示该方法没有输入参数。
所以第二个例子和
一样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
,这意味着这个匿名方法有一个输入参数