C# 不绑定标识符就调用函数意味着什么
我理解Lambda表达式的含义是: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
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!");