1 委托delegate作用和
//委托:方法
//类A(a)---> 类B(b,c)
//问题:c是无法直接访问A中的a方法!使用委托可以完成这个任务。
//委托是对a这个方法的访问起到“桥梁”作用。
//委托:其实就是相当于把一个方法当成变量来使用。
//委托五步法!
namespace thinger.DelegateTeachDemo
{
class Program
{
static void Main(string[] args)
{
//【3+4可以合并】
StudyDelegate myStudy1 = new StudyDelegate(MyStudy1)
//【3】创建委托变量
StudyDelegate myStudy = null;
//【4】关联委托方法
myStudy = MyStudy1;
//多路委托(多播)
myStudy += MyStudy3;
myStudy += MyStudy2;
//【5】使用委托变量
myStudy();
Console.WriteLine("----------------------------");
//动态删除关联
myStudy -= MyStudy3;
myStudy();
Console.ReadLine();
}
//【2】方法编写
static void MyStudy1()
{
Console.WriteLine("我正在学习C#上位机开发!");
}
static void MyStudy2()
{
Console.WriteLine("你正在学习C#上位机开发!");
}
}
//【1】声明委托(声明一个方法的原型)
public delegate void StudyDelegate();
}
使用步骤
- 声明一个委托(方法的原型)
- 编写方法
- 创建委托类型变量
- 关联委托方法
- 使用委托变量
多播委托 使用订阅运算符+= 关联方法时 先订阅的先执行
2 委托delegate实现窗体数据逆向传值
背景:在父窗体点击按钮创建3个子窗体 在子窗体使用文本框、按钮控件通过发送消息到父窗体显示,
解决思路,通过委托调用父窗体的输入方法进行消息的传递发送
namespace thinger.DelegateApp2
{
//委托不仅解决了,数据的逆向传递,还可以有效的提升代码的优质性!
//【1】声明委托
public delegate void ReceiveDelegate(string data);
public partial class FrmMain : Form
{
public FrmMain()
{
InitializeComponent();
}
//【3】创建委托变量(私有化)
private ReceiveDelegate receivgMsg = null;
private void btnCreateChild_Click(object sender, EventArgs e)
{
for (int i = 1; i < 4; i++)
{
FrmChild frm = new FrmChild(i);
frm.Show();
//【4】关联委托变量和方法
this.receivgMsg += frm.ReceiveMsg; //这里必须使用+=!!!!!!
}
}
//广播消息
private void btnSend_Click(object sender, EventArgs e)
{
//【5】使用委托变量
receivgMsg(this.txtSendMsg.Text.Trim());
}
}
}
namespace thinger.DelegateApp2
{
public partial class FrmChild : Form
{
public FrmChild(int num)
{
InitializeComponent();
this.Text += $" [{num}]";
}
//【2】编写具体方法(公有化)
public void ReceiveMsg(string data)
{
this.txtContent.Text += data + "\r\n";
}
}
}
总结
委托和类平级 ,注意书写 ,方法写在类中,语句写在方法中
委托的位置是无关紧要的 但要是公共的
将子窗口的委托变量声明为private时 在父窗口是无法访问到该变量的
3 委托delegate实现广播 多播
背景,在父窗体中发送消息 在所有子窗体中显示
本质上在父窗体通过委托调用子窗体方法进行消息显示 使用多播
namespace thinger.DelegateApp2
{
//委托不仅解决了,数据的逆向传递,还可以有效的提升代码的优质性!
//【1】声明委托
public delegate void ReceiveDelegate(string data);
public partial class FrmMain : Form
{
public FrmMain()
{
InitializeComponent();
}
//【3】创建委托变量(私有化)
private ReceiveDelegate receivgMsg = null;
private void btnCreateChild_Click(object sender, EventArgs e)
{
for (int i = 1; i < 4; i++)
{
FrmChild frm = new FrmChild(i);
frm.Show();
//【4】关联委托变量和方法
this.receivgMsg += frm.ReceiveMsg; //这里必须使用+=!!!!!!
}
}
//广播消息
private void btnSend_Click(object sender, EventArgs e)
{
//【5】使用委托变量
receivgMsg(this.txtSendMsg.Text.Trim());
}
}
}
namespace thinger.DelegateApp2
{
public partial class FrmChild : Form
{
public FrmChild(int num)
{
InitializeComponent();
this.Text += $" [{num}]";
}
//【2】编写具体方法(公有化)
public void ReceiveMsg(string data)
{
this.txtContent.Text += data + "\r\n";
}
}
}