c# 委托(Delegate)
委托是c#中一个重要的概念。
一:委托
委托是和类一样的用户自定义类型。
二:委托的声明
既然委托也和类一样是一种类型,那么在它被用来创建变量之前该声明。
//声明一个普通的类 public class Student { } //声明一个委托类型 public delegate void Show(string hint); //声明一个方法 public void Show(string hint) { //some codes here. }
可以看到,声明一个委托类型和声明一个方法非常像。
格式:
1.用delegate关键字修饰
2.返回类型+委托类型名字+参数列表
三:实例化委托
//声明一个委托 public delegate void ShowMessage(string hint); //声明一个要被委托的方法,该方法的返回类型的,参数都和我们声明的委托一样 public void ShowName(string name) { MessageBox.Show(name); } //直接调用方法 //ShowName("233"); //实例化一个委托 在实例化一个委托的时候,需要给一个参数,这个参数就是要被执行的方法名字。 ShowMessage sm = new ShowMessage(ShowName);
//执行委托 实际上就是帮忙调用一下方法
sm("2333");
例如:上面的代码中我声明了一个ShowMessage的委托类型。其实简单来看,我们可以把委托看成一个可以用来帮忙执行方法的东西。Delegate在英文里是代表的意思。意思是我声明的这个委托可以帮忙执行一些别的方法。
只不过对帮忙执行的方法有条件,被执行的方法的返回类型和参数必须要和我声明的委托一样。
在上面的例子中就是,任何一个返回值是void,参数是一个string类型的方法都可以被我声明的ShowMessage这个委托代替执行。
四:委托 += -=
+=:添加
-=:减去
public void ShowSex(string sex) { MessageBox.Show(sex); }
ShowMessage sm; sm = ShowName; sm += ShowSex;
给委托再添加一个方法。表明委托要帮忙执行两个方法。
减去则相反。
可以将多个方法赋给同一个委托,或者叫将多个方法绑定到同一个委托,当调用这个委托的时候,将依次调用其所绑定的方法。
五:WinForm中委托的使用
在WinForm中,给一个按钮添加一个Click事件,只要在事件那个托盘那里找到Click事件。双击就行,ide会帮你做很多事情。
但是如果要为一个在后台创建的Button添加Click事件时,就要写另外的代码了。
public Form1() { InitializeComponent(); //在后台添加一个Button按钮 Button btn = new Button(); //给属性赋值 btn.Text = "新添加的按钮"; //给Button添加事件 btn.Click +=new EventHandler(button1_Click); }
private void button1_Click(object sender, EventArgs e) { }
在给Button添加Click事件时,用到了委托。
Button的Click的定义:(在编辑器里找到Click按F12,可以跳到对应的定义)
public event EventHandler Click;
这里public event 这两个词都是关键字,而后面的EventHandler则是Click的类型
再EventHandler 按F12跳到它的定义
public delegate void EventHandler(object sender, EventArgs e);
这就很好解释了。
系统声明了一个名字叫EventHandler的委托。而Button的Click正是EventHandler类型。
我们添加Click事件的时候,实际上就是给委托的调用。