C# 不绑定标识符就调用函数意味着什么

C# 不绑定标识符就调用函数意味着什么,c#,multithreading,lambda,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 voi

我理解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);
    }
我不太明白
()=>
是什么意思,在谷歌搜索之后,我发现(根据维基百科)我正在使用一个未定义(?)和/或未绑定到标识符的匿名函数

现在,我问这是什么意思?我正在做我刚才说的吗?

()
意味着该方法没有输入参数

因此,第二个示例与:

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
,表示此匿名方法有一个输入参数。

表示它是一个匿名函数(lambda表达式),没有任何参数。通常需要lambda的参数来处理它。但是,如果您不需要任何参数,比如在Print语句中,那么可以使用空参数集调用它。当您意识到只有一个参数时,括号是可选的,这就更有意义了。但是如果有多个参数,或者没有参数,则需要它们

即:

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

在本例中,这将用作的参数

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

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

所以它相当于:

ThreadStart tmp = () => Print("Hello from t!");
Thread t = new Thread(tmp);
要使用
参数化线程启动
,有三个选项:

// 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!");

(同样,这些可以内联到
线程
构造函数调用中,编译器将推断出要使用哪个构造函数。)

这正是您所说的。这是一种匿名方法。没有名称的方法(或者,使用等效术语,没有标识符)。那会让人困惑吗?当你可以使用
Func del=x=>x*x
@abatishchev-我确信这只是一个任意的例子,不需要挑剔。快速术语迂腐:它不是匿名方法,它是一个lambda表达式。这是一个匿名函数,但匿名方法应该是
delegate{…}
@JonSkeet-我受到了适当的惩罚。非常感谢。
ThreadStart tmp = () => Print("Hello from t!");
Thread t = new Thread(tmp);
// 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!");