委托是什么:
安全的函数指针,
通过自定方法调用方法,实现功能
用delegate来声明委托方法:
//委托的实现
public delegate int SumAdd(int a, int b);//声明一个方法
class Program
{
static void Main(string[] args)
{
Program p = new Program();//通过这个方法,找到当前类下的方法执行
SumAdd sumadd = new SumAdd(p.AddSum);//sumadd相当于指针指向p.Addsum的地址
int sum = sumadd(3, 3);
Console.WriteLine(sum);
Console.ReadKey();
}
public int AddSum(int a, int b)
{
return a + b;
}
}
委托创建:
准备一个方法:
public int AddSum(int a, int b)
{
return a + b;
}
声明委托:delegate声明委托
创建委托对象: SumAdd sumadd = new SumAdd(p.AddSum)
追加方法:sumadd +=AddSum
删除方法:sumadd -=AddSum
调用: int sum = sumadd(3, 3);
但是因为这个声明后,需要实例化调用,而且多数委托声明的情况无非两种:一种有返回值,一种没有返回值。微软就把委托的声明封装成了两个固定的声明办法,不需要调用委托的时候再实例化:
Active<>
func<>
再来列举一个简单的实例
Active<>
是一个封装好的委托方法,只有一个参数,没有返回值。使用委托方法的时候不用再实例化,直接使用方法。
实现内容:建立4个窗体1个Parent;3个Son;,Parent发送一条消息,Son窗体上获得这个消息,也可以让其中一个不获得。
public partial class frmParent : Form
{
//定义委托aftermesg,而且只有一个参数string类型,没有返回值;
public Action<string> aftermesg { get; set; }
public frmParent()
{
InitializeComponent();
}
private void frmParent_Load(object sender, EventArgs e)
{
//实例化三个窗体son
frmSon son = new frmSon();
frmSon2 son2 = new frmSon2();
frmSon3 son3 = new frmSon3();
//使用委托方法,追加多个son窗体接收委托方法传递的值
aftermesg += son.sendtxt;
aftermesg += son2.showtxt;
aftermesg += son3.showtxt;
//aftermesg -= son2.showtxt;//可以删除son2窗体使用委托方法
//显示子窗体
son.Show();
son2.Show();
son3.Show();
}
private void button1_Click(object sender, EventArgs e)
{
//委托方式;
if (aftermesg == null)
{
return;
}
//把委托的信息传递给text
aftermesg(this.txtp.Text);
}
效果图,如下: