匿名函数
概念:没有名字的函数,一般情况下只调用一次。它的本质就是一个方法,虽然我们没有定义这个方法,但是编译器会把匿名函数编译成一个方法
public delegate void Del1();//无参数无返回值的委托
public delegate void Del2(string name);//有参数无返回值的委托
public delegate string Del3(string s,int n);//有参数有返回值的委托
internal class Program
{
static void Main(string[] args)
{
Del1 del1 = delegate ()
{
Console.WriteLine("无参数无返回值的匿名函数");
};
del1.Invoke();
Console.ReadKey();
}
}
我们可以使用lambda表达式更简洁地定义一个匿名函数
Del1 del1 = () => { Console.WriteLine("无参数无返回值的lambda表达式"); };
del1.Invoke();//调用
Console.ReadKey();
当lambda表达式中参数列表只有一个参数时,括号可以省略
Del2 del2 = msg => { Console.WriteLine("hello" + msg); };
del2.Invoke("world" + "有参数无返回值的lambda表达式");
Console.ReadKey();
匿名函数定义的参数列表的参数类型,是不能省略的
Del3 dle3 = (string s1, int n1) => { return "有参数有返回值的lambda表达式"; };
string res = dle3.Invoke("1", 1);
Console.WriteLine(res);
泛型委托
之前我们写的委托都是需要自己定义委托的参数和返回值,而.NET框架为我们封装了泛型委托框架,让我们不用再声明委托,可以直接使用。分别为Action委托,Func委托。
Action委托:
不带返回值的委托,可以有参数,也可以没有参数
Action action = () => { Console.WriteLine("无参无返回值的委托"); };
action();//直接调用
action.Invoke();//间接调用
Action<string,int> action2 = (a,b)=> { Console.WriteLine("姓名为{0}的人,年龄为{1}",a,b); };
action2.Invoke("张三",18);
Console.ReadKey();
Func委托:
带返回值的委托
//如果Func尖括号里只有一个参数类型,就表示返回值就是这个类型
Func<int> func = () => { return 100; };
int a = func.Invoke();
Console.WriteLine(a);
//需要两个整数类型的参数,以及一个string类型的返回值
Func<int, int, string> func2 = (c, d) => { Console.WriteLine(c); Console.WriteLine(d); return "hello world"; };
string res = func2.Invoke(10, 20);
Console.WriteLine(res);
使用委托进行窗体传值
1、先创建两个窗体对象,添加所需控件
2、当点击form1按钮时,将textbox里的值传递给form2
namespace 委托_窗体传值
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
//创建一个form2对象,通过form2的构造函数将窗体1的文本框的值传递给窗体2
Form2 form2 = new Form2(textBox1.Text.Trim());
//将窗体2展示出来
form2.Show();
}
}
}
namespace 委托_窗体传值
{
public partial class Form2 : Form
{
public Form2(string msg)//窗体2的构造函数,每回创建窗体2对象的时候都会执行构造函数初始化。通过参数接收窗体一传递过来的值
{
InitializeComponent();
textBox1.Text = msg;//将接收到的值展示到窗体2的文本框上
}
p