前段时间学习了EF映射,而对EF映射的学习又不得不提到lambda表达式,而这篇博客主要讲的既不是lambda表达式,也不是EF映射,而是我们都知道而又不常常使用的委托。
委托的定义
委托的出现使得方法能够像参数一样进行传递,我认为委托就是方法的一个载体。从数据结构方面来思考,它可以被认为是一种数据类型。从某种意义上说委托是方法的抽象,它存储的就是一系列具有相同签名和返回回类型的方法的地址。调用委托的时候,委托的方法列表将依次被执行。
委托的创建和声明
委托使用关键字delegate来创建。修饰符 + delegate+ 返回值 +委托变量名+(参数)
public delegate string frmshow(); //创建委托
public static frmshow οnshοw=new frmshow(this.showText); //委托的声明以及赋值
private string showText()
{
return this.Text;
}
委托的运算
form1show = this.showText;
form1show += this.showName; //+运算符,把方法加载到委托列表中,同样也可以有-运算符,把方法从委托的方法列表中去掉
委托实例
窗体1的name和text是私有的,假设我们在窗体2不能直接获得窗体1的name和text,那么我们可以在窗体1上提供一个委托,使窗体2通过委托来获得name和text。也就是说:类2可以通过委托来获得类1中不能直接获得的某些数据。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
form1show = new frmshow[] { this.showText, this.showName };
}
public delegate string frmshow();
public static frmshow[] form1show;
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show(showText ());
}
private string showText()
{
return this.Text;
}
private string showName()
{
return this.Name;
}
private void button2_Click(object sender, EventArgs e)
{
Form2 frm = new Form2();
frm.Show();
}
}
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
//Delegate[] del = Form1.form1show.GetInvocationList();
//Form1.frmshow[] delegates = new Form1.frmshow();
//申明一个变量i作为计数器
Form1.frmshow[] umath = Form1.form1show;
int i = 0;
foreach (Form1.frmshow d in Form1.form1show) //循环遍历,调用委托列表的 方法。
{
MessageBox.Show(d());
}
}
}
以上总结如有错误,还请指出。多谢来访。