欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【C#学习笔记】C#委托从概念到理解到应用

程序员文章站 2022-06-02 22:14:00
...


1. 概念


1.1 了解委托(delegate)

1、委托是一种全新的面向对象语言特性,运行在.NET平台
2、基于委托,开发事件驱动程序变得非常简单
3、使用委托可以大大简化多线程的难度

1.2 理解委托

1、委托,也可以看成是一种数据类型,可以定义变量,但是它是一种特殊的变量
2、委托定义的变量能接收的数值只能是一个方法(函数),可以理解成委托就是一个方法(函数)的指针(存储方法的变量)


2. 委托的使用


【1】声明委托(定义一个函数的原型:返回值+参数类型和个数)注意:委托的声明要定义在类的外面

public delegate int CalculatorDelegate(int a,int b);

【2】根据委托定义一个“具体方法”实现加法功能(写在类里面)

static int Add(int a,int b)
{
  return a+b;
}

【2】根据委托定义一个“具体方法”实现减法功能(写在类里面)

static int Sub(int a,int b)
{
  return a-b;
}

【3】创建委托对象,关联“具体方法”


CalculatorDelegate objCal=new CalculatorDelegate(Add);

【4】通过委托调用方法(而不是直接使用方法)

int result=objCal(10,20);

【5】委托对象所关联的方法可以动态的变化

objCal-=Add;//将委托变量所代表的具体方法“解绑”
objCal+=Sub;//重新指向一个新的方法

3. 委托的应用


3.1 从窗体–>主窗体的通信


【C#学习笔记】C#委托从概念到理解到应用

主窗体code


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 DelegateTest1
{
    public delegate void ShowCountDelegate(string content);
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            Form2 objFrm2 = new Form2();
            objFrm2.msgsender = this.Receiver;
            objFrm2.Show();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
        
        private void Receiver(string content)
        {
            this.label2.Text = content;
        }
    }
}

从窗体code


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 DelegateTest1
{
    public partial class Form2 : Form
    {

        public ShowCountDelegate msgsender;
        private int content = 0;


        public Form2()
        {
            InitializeComponent();
        }

        private void Form2_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            content++;
            if (msgsender != null)
            {
                msgsender(content.ToString());//[5]调用
            }
        }
    }
}

【C#学习笔记】C#委托从概念到理解到应用


3.1 主窗体–>从窗体的通信


【C#学习笔记】C#委托从概念到理解到应用


3.1.1 主窗体code


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 DelegateTest2
{
    //[1]声明委托
    public delegate void ShowCountDelegate(string count);

    public partial class Form1 : Form
    {
        //[3]创建委托对象
        public ShowCountDelegate objShowCountDelegate;

        public Form1()
        {
            InitializeComponent();

            Form2 objfrm1 = new Form2();
            Form3 objfrm2 = new Form3();
            Form4 objfrm3 = new Form4();

            //[4]委托对象关联从窗体方法
            objShowCountDelegate += objfrm1.Receiver;
            objShowCountDelegate += objfrm2.Receiver;
            objShowCountDelegate += objfrm3.Receiver;
            objfrm1.Show();
            objfrm2.Show();
            objfrm3.Show();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private int count = 0;
        private void button1_Click(object sender, EventArgs e)
        {
            count++;
            objShowCountDelegate.Invoke(count.ToString());//[5]利用委托调用方法
        }

        private void button2_Click(object sender, EventArgs e)
        {
            count = 0;
            objShowCountDelegate.Invoke("0");
        }
    }
}

3.1.2 从窗体code


从窗体1


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 DelegateTest2
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private void Form2_Load(object sender, EventArgs e)
        {

        }

        //[2]根据委托创建方法
        public void Receiver(string count)
        {
            this.label1.Text = count;
        }
    }
}

从窗体2


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 DelegateTest2
{
    public partial class Form3 : Form
    {
        public Form3()
        {
            InitializeComponent();
        }

        private void Form3_Load(object sender, EventArgs e)
        {

        }

        //[2]根据委托创建方法
        public void Receiver(string count)
        {
            this.label1.Text = count;
        }
    }
}

从窗体3


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 DelegateTest2
{
    public partial class Form4 : Form
    {
        public Form4()
        {
            InitializeComponent();
        }

        private void Form4_Load(object sender, EventArgs e)
        {

        }

        //[2]根据委托创建方法
        public void Receiver(string count)
        {
            this.label1.Text = count;
        }
    }
}

【C#学习笔记】C#委托从概念到理解到应用


4. 扩展


【C#学习笔记】委托的应用


5. 参考资料


【1】C#入门面向对象编程(委托的使用)