其实匿名方法说起来也很简单,就是一种不需要名称的内联委托。
以前,我们要写下面这些代码:
public class Sample : Form{
Button btn;
public Sample{
btn = new Button();
btn.Click += new EventHandler(btn_Click);
}
private void btn_Click(object sender, EventArgs e){
this.Close():
}
}
在上例中,为了一个简单的this.Close;而新建一个带有两个参数的方法,而当我们运用匿名方法之后,会变得很简单:
public class Sample : Form{
Button btn;
public Sample{
btn = new Button();
btn.Click += delegate{
this.Close();
};
}
}
这样我们可以看到,匿名方法适用于这种不想浪费一个单独方法来完成一项简单操作的情形。同样我们也可以感觉到,匿名方法其实用起来也很简单。
一个匿名方法包括关键字delegate以及一个可选的参数表。在上例中,我已经将参数表省略了,然而如果遇到方法中需要访问参数的情形,则必须提供完整的参数表:
btn.Click += delegate(object sender, EventArgs e){
((Button)sender).Enabled = false;
};
当然,方法设计也可以如此:
delegate void DelegateSample();
static void Main(){
DelegateSample d = delegate{
Console.WriteLine("Hello");
}
d();
Console.WriteLine("Again...");
d();
}
这样,就无需单独新建一个方法却可以反复重用这一部分代码。
怎样设计才是一个合法的匿名方法呢?需要满足两点:
1.参数表匹配。
2.匿名方法的返回值可以显示转换为目标委托的返回值,或者均无返回值。
此外,C# 2.0还提供方法的自动转换(方法组转换),比如最开始的例子中:
btn.Click += new EventHandler(btn_Click);
其实可以直接写为:
btn.Click += btn_Click;
编译器会自动进行判断。
以前,我们要写下面这些代码:
public class Sample : Form{
Button btn;
public Sample{
btn = new Button();
btn.Click += new EventHandler(btn_Click);
}
private void btn_Click(object sender, EventArgs e){
this.Close():
}
}
在上例中,为了一个简单的this.Close;而新建一个带有两个参数的方法,而当我们运用匿名方法之后,会变得很简单:
public class Sample : Form{
Button btn;
public Sample{
btn = new Button();
btn.Click += delegate{
this.Close();
};
}
}
这样我们可以看到,匿名方法适用于这种不想浪费一个单独方法来完成一项简单操作的情形。同样我们也可以感觉到,匿名方法其实用起来也很简单。
一个匿名方法包括关键字delegate以及一个可选的参数表。在上例中,我已经将参数表省略了,然而如果遇到方法中需要访问参数的情形,则必须提供完整的参数表:
btn.Click += delegate(object sender, EventArgs e){
((Button)sender).Enabled = false;
};
当然,方法设计也可以如此:
delegate void DelegateSample();
static void Main(){
DelegateSample d = delegate{
Console.WriteLine("Hello");
}
d();
Console.WriteLine("Again...");
d();
}
这样,就无需单独新建一个方法却可以反复重用这一部分代码。
怎样设计才是一个合法的匿名方法呢?需要满足两点:
1.参数表匹配。
2.匿名方法的返回值可以显示转换为目标委托的返回值,或者均无返回值。
此外,C# 2.0还提供方法的自动转换(方法组转换),比如最开始的例子中:
btn.Click += new EventHandler(btn_Click);
其实可以直接写为:
btn.Click += btn_Click;
编译器会自动进行判断。