1、委托是一种类型,声明一个委托的时候有点像创建一个方法,我们下面两个例子都用的委托,代码如下,eg:
public delegate int MyDelegate1(int i);
示例代码,eg:
1 public Form3() 2 { 3 InitializeComponent(); 4 } 5 public int F1(int i) 6 { 7 return 1; 8 } 9 public int F2(int i) 10 { 11 return 2; 12 } 13 public int F3(int i) 14 { 15 return 3; 16 } 17 public int F4(int i) 18 { 19 return 4; 20 } 21 22 private void Form3_Load(object sender, EventArgs e) 23 { 24 MyDelegate1 myDelegate1 = F1; 25 Console.WriteLine(myDelegate1.Invoke(2));//本质是通过invoke调用,不过可以写成下面的简写方式 26 Console.WriteLine(myDelegate1(2));//简写形式 27 }
2、委托链可以增加方法,可以移除方法,如果是无返回值的方法,我们把它们都绑定到一个委托上面的话,直接调用,那么调用此委托就会依次调用其中的方法;但是如果是多个有返回值的委托链,如果我们不采用特殊手段,直接调用的话,会返回最后一个方法的值,那么我们只能通过下面的方法来实现了,下面方法的本质也是一个个的调用其中的方法,使用GetInvocationList()来获取多播中的单独委托然后一个一个的执行然后我们可以把值存放到一个数组或者list泛型中去。具体代码如下,eg:
public int F1(int i) { return 1; } public int F2(int i) { return 2; } public int F3(int i) { return 3; } public int F4(int i) { return 4; } MyDelegate1 myDelegate1 = F1; myDelegate1 += F2; myDelegate1 += F3; myDelegate1 += F4; List<int> list = new List<int>(); Delegate[] myDelegates = myDelegate1.GetInvocationList(); foreach (var myDelegate in myDelegates) { MyDelegate1 m1 = (MyDelegate1)myDelegate;//注意此处需强转 list.Add(m1.Invoke(2));//等价于list.Add(m1(2)); } foreach (var i in list) { Console.WriteLine(i); } Console.ReadLine();
结果输出是1,2,3,4
3、利用委托WinForm窗体之间传值,Form1页面传递值到Form2,然后再从Form2窗体传值到Form1窗体,代码如下,eg:
Form1窗体(包含一个button、一个textbox)
1 private void button1_Click(object sender, EventArgs e) 2 { 3 string str = textBox1.Text; 4 //向Form2传递一个方法,并且在Form2中调用此方法 5 Form2 fr2 = new Form2(str,SetValue); 6 fr2.Show(); 7 } 8 9 public void SetValue(string str)//此处方法可以是public类型的也可以是private类型的,无所谓 10 { 11 this.textBox1.Text = str; 12 }
From2窗体(一个button、一个textbox、一个label)
private MyDelegate myDelegate; public Form2() { InitializeComponent(); } public Form2(string str, MyDelegate myDelegate) : this() { this.label1.Text = str; this.myDelegate = myDelegate; } private void button1_Click(object sender, System.EventArgs e) { myDelegate(textBox1.Text);//此处调用委托 }
委托代码
public delegate void MyDelegate(string textBox);
我们之所以用委托就是我们一些地方的时候可能会有很多种,我们不敢确定用哪一种,并且其他地方的代码都是公用代码,这个时候我们就需要使用委托,如我们有一个方法中对外开放了一个委托,此处大家可以把执行时间存放到数据库或者写到记事本,或者只是输出查看一下,这个时候我们就可以声明一个委托变量,然后在其他地方实现了这个委托就可以了。目前来看我们很少使用自己定义的委托,因为系统已经为我们提供了很多委托,如非泛型委托Action(无参无返回值)、泛型委托Action(有参数无返回值)、Predicate有一个参数有一个bool返回值、Func泛型委托(可以有16个输入参数一个返回值)!