调用一个没有绑定到标识符的函数是什么意思?

本文关键字:标识符 函数 是什么 意思 绑定 一个 调用 | 更新日期: 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,这意味着这个匿名方法有一个输入参数