委托基础(delegate)

委托基础(delegate)

为什么使用委托?

委托:委托别人去做一件事情?通常的情况,就是这件事情,自己做不了。

程序:在写程序的时候,我们也会遇到类似情况。

OOP程序使用对象的顺序(对象调用的关系)

UI(窗体) --> 通讯库(连接、关闭、读取、写入、消息传递…)

​ 《–通讯主动发消息(逆向消息传递)委托》

很多情况,对象之间会涉及到消息的逆向问题!

类A 				UI
{
	A2()
	{
		类B	对象B=new 类B();
		对象B.b1();
	}
	A1();
}

类B				通信库
{
	B1();
	B2()	//想调用类A中A2这个方法?
	{
		类A 对象A=new 类A (); //这个是错误的方法。用委托
		对象A.A1();
	}
}

其他的应用:多线程中大量使用


委托学习

  1. 委托的基本使用
  2. 委托的应用场景

委托的概念:委托其实本质就是代表一个方法,解决方法 “逆向调用” 问题。

变量:int a = 100; a代表100这个整数。换句话说委托是一个方法的变量。

委托定义:就是规定方法的原型(返回值,参数类型和个数)。

应用场景:做一个报警系统,可以有若干模块。

委托定义和使用的五个步骤:

  1. 声明委托类型(定义方法原型)
  2. 编写具体方法
  3. 创建委托变量
  4. 关联具体方法
  5. 使用委托变量
namespace 委托
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //Start1();
            //Start2();
            //Start3();

            //【3】 创建委托变量
            //StartEquipDelegate myEquip = new StartEquipDelegate(Start1);
            StartEquipDelegate myEquip = null;

            //【4】 关联方法
            myEquip = Start1;
            myEquip += Start2;
            myEquip += Start3;

            //【5】 使用委托变量
            myEquip();
            Console.WriteLine("******************************");
            myEquip -= Start2;
            myEquip();

            Console.Read();
        }

        //【2】 方法编写
        static void Start1()
        {
            Console.WriteLine("第一台设备正在启动!");
        }
        static void Start2()
        {
            Console.WriteLine("第二台设备正在启动!");
        }
        static void Start3()
        {
            Console.WriteLine("第三台设备正在启动!");
        }
    }
    //【1】 声明委托(定义方法原型)
    public delegate void StartEquipDelegate();
}

案例:窗体逆向消息传递问题!

记住:当用正常的方法无法访问到一个对象的时候,应该考虑到委托!


案例:

  1. 声明委托类型(在哪里声明?)只要是类的外面即可(在那个类文件中无所谓)
  2. 编写具体方法(在调用类中写)
  3. 创建委托变量(谁使用,谁创建)
  4. 关联具体方法(委托变量和具体方法关联)(在调用的类中,紧跟着对象创建的地方写)
  5. 使用委托变量(和委托变量在一个类中)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace thinger.DelegateApp1
{
    //1.声明委托类型
    public delegate void ReceiveDelegate(string data);
    public partial class FrmMain : Form
    {
        public FrmMain()
        {
            InitializeComponent();
        }

        //2.编写具体方法
        private void ShowMsg(string info)
        {
            this.textBox1.Text += info + "\r\n";
        }

        //创建子窗体
        private void button1_Click(object sender, EventArgs e)
        {
            for (int i = 1; i < 4; i++)
            {
                FrmChild frm = new FrmChild(i);
                frm.Show();

                //4.关联委托变量(具体方法)
                frm.DataReceive += ShowMsg;
            }
        }
    }
}

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace thinger.DelegateApp1
{
    public partial class FrmChild : Form
    {
        public FrmChild(int num)
        {
            InitializeComponent();
            this.Text += "_" + num;
        }

        //3.创建委托变量
        public ReceiveDelegate DataReceive { get; set; }

        private void button1_Click(object sender, EventArgs e)
        {
            //5.使用委托变量
            DataReceive(this.textBox1.Text.Trim());
        }
    }
}

你可能感兴趣的:(c#)