委托的概念

一、了解委托(delegate)
1、委托是一种全新的面向对象语言特性,运行在.NET平台
2、基于委托,开发事件驱动程序变得非常简单
3、使用委托可以大大简化多线程的难度
二、理解委托
1、委托,也可以看成是一种数据类型,可以定义变量,但是它是一种特殊的变量
2、委托定义的变量能接收的数值只能是一个方法(函数),可以理解成委托就是一个方法(函数)的指针(存储方法的变量)
                                                      
                                            方法1
方法调用---->委托对象---->  方法2
                                            方法3
委托的使用
【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;//重新指向一个新的方法

委托的应用

一、从窗体到主窗体的通信

主窗体:FrmMain.cs

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 DelegateApp
{
    public partial class FrmMain : Form
    {
        public FrmMain()
        {
            InitializeComponent();
            FrmOther objFrmOther = new FrmOther();
            //[4]将从窗体委托对象属性和主窗体委托方法关联
            objFrmOther.msgsender = this.Receiver;
            objFrmOther.Show();
        }
        //[2]根据委托构建方法
        private void Receiver(string content)
        {
            this.lblCount.Text = content;
        }
        private void FrmMain_Load(object sender, EventArgs e)
        {

}
    }
    //[1]声明委托
    public delegate void ShowCountDelegate(string content);
}

从窗体:FrmOther

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 DelegateApp
{
    public partial class FrmOther : Form
    {
        public FrmOther()
        {
            InitializeComponent();
        }
        //[3]根据委托创建对象
        public ShowCountDelegate msgsender;
        private int content = 0;
        private void btnClick_Click(object sender, EventArgs e)
        {
            content++;
            if (msgsender!=null){
                msgsender(content.ToString());//[5]调用
            }
        }

private void FrmOther_Load(object sender, EventArgs e)
        {

}
    }
}

二、主窗体到从窗体的通信

主窗体:FrmMain.cs

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 DelegateApp2
{
    public partial class FrmMain : Form
    {
        //[3]创建委托对象
        public ShowCountDelegate objShowCountDelegate;
        public FrmMain()
        {
            InitializeComponent();
            FrmOther1 objFrmOther1 = new FrmOther1();
            FrmOther2 objFrmOther2 = new FrmOther2();
            FrmOther3 objFrmOther3 = new FrmOther3();
            //[4]委托对象关联从窗体方法
            objShowCountDelegate += objFrmOther1.Receiver;
            objShowCountDelegate += objFrmOther2.Receiver;
            objShowCountDelegate += objFrmOther3.Receiver;
            objFrmOther1.Show();
            objFrmOther2.Show();
            objFrmOther3.Show();
        }

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

private void btnReset_Click(object sender, EventArgs e)
        {
            count = 0;
            objShowCountDelegate.Invoke("0");
        }
    }
    //[1]声明委托
    public delegate void ShowCountDelegate(string count);
}

从窗体

FrmOther1

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 DelegateApp2
{
    public partial class FrmOther1 : Form
    {
        public FrmOther1()
        {
            InitializeComponent();
        }
        //[2]根据委托创建方法
        public void Receiver(string count)
        {
            this.lblCount.Text = count;
        }
        private void lblCount_Click(object sender, EventArgs e)
        {

}
    }
}

FrmOther2

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 DelegateApp2
{
    public partial class FrmOther2 : Form
    {
        public FrmOther2()
        {
            InitializeComponent();
        }
        //[2]根据委托创建方法
        public void Receiver(string count)
        {
            this.lblCount.Text = count;
        }
        private void FrmOther2_Load(object sender, EventArgs e)
        {

}
    }
}

FrmOther3

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 DelegateApp2
{
    public partial class FrmOther3 : Form
    {
        public FrmOther3()
        {
            InitializeComponent();
        }
        //[2]根据委托创建方法
        public void Receiver(string count)
        {
            this.lblCount.Text = count;
        }
        private void FrmOther3_Load(object sender, EventArgs e)
        {

}
    }
}

总结:多窗体通信个人理解:哪个窗体接受消息,委托方法就写在那里。然后另一个窗体通过委托调用这个方法。

转载于:https://www.cnblogs.com/cuig/p/8880075.html

C#入门面向对象编程(委托的使用)相关推荐

  1. 面向对象编程思想及入门知识

    这几天在调程序,所以想写写自己对"面向对象编程"的一些理解,希望对打算入门计算机编程的同志们有所帮助.之前,好几个师弟问过我,C++与C有什么区别,学习面向对象语言需要掌握哪些基础 ...

  2. Python|装饰器|执行时间|递归|动态属性|静态方法和类|继承和多态|isinstance类型判断|溢出|“魔法”方法|语言基础50课:学习记录(6)-函数的高级应用、面向对象编程、进阶及应用

    文章目录 系列目录 原项目地址: 第16课:函数的高级应用 装饰器(记录执行时间的例子) 递归调用 简单的总结 第17课:面向对象编程入门 类和对象 定义类 创建和使用对象 初始化方法 打印对象 面向 ...

  3. python入门:正则表达式,面向对象编程,零基础视频教程分享

    正则表达式 import re #首先必须import re模块,re=Regular Expression,就是正则表达式的意思. pattern=re.compile(r'hello') #指明你 ...

  4. [Java入门笔记] 面向对象编程基础(二):方法详解

    2019独角兽企业重金招聘Python工程师标准>>> 什么是方法? 简介 在上一篇的blog中,我们知道了方法是类中的一个组成部分,是类或对象的行为特征的抽象. 无论是从语法和功能 ...

  5. php是不是面向对象编程,PHP面向对象编程入门

    1.常用术语说明 class 类 object 对象 new 实例化 member 类成员 method 方法,成员函数 property 属性,成员变量 constant 类常量 2.类的构造 cl ...

  6. python 类和对象_Python零基础入门学习33:类与面向对象编程:类的继承

    注:本文所有代码均经过Python 3.7实际运行检验,保证其严谨性. 本文字数约1300,阅读时间约为3分钟. Python面向对象编程 类的继承机制 如果一个类A继承自另一个类B,就把继承者类A称 ...

  7. Java面向对象编程入门练习:Manager类继承Employee类并实现求得员工平均业绩

    Java面向对象编程入门练习:Manager类继承Employee类并实现求得员工平均业绩 请定义一个Manager类,该类继承Employee类,并定义两个变量及一个构造方法,两个变量:depart ...

  8. python快速入门【五】---- 面向对象编程、python类

    python入门合集: python快速入门[一]-----基础语法 python快速入门[二]----常见的数据结构 python快速入门[三]-----For 循环.While 循环 python ...

  9. 【手把手教你】Python面向对象编程入门及股票数据管理应用实例

    1 前言 一般而言,在学习或练习python的初级阶段,在Jupyter Notebook(spyder或pycharm)上进行逐条执行语句和代码,这样可以起到交互的良好效果.但是如果要进行大一点的项 ...

最新文章

  1. M1芯片成功运行Linux,终端一行代码启动安装,也能一键删除卸载
  2. 在思科路由器上做 _限速
  3. 软件项目管理四个核心价值观
  4. php size(),PHP filesize() 函数
  5. 一个U盘走天下,装机大神撩妹的不二之选
  6. 文本检查点web_reg_find和web_find两个函数的区别
  7. linux 环境变量和shell变量
  8. python如何获得列表中某个元素的index
  9. BOSS直聘数据采集、解析处理、分析与可视化实战
  10. 【OWASP TOP10】2021全球十大常见安全漏洞
  11. html5摄像头手势识别,基于OpenCV的摄像头动态手势轨迹识别及其应用
  12. 面试秘籍大放送,编测编学独家秘籍遭外泄?!
  13. 易基因|手把手教你做全基因组DNA甲基化测序分析
  14. 【环信IM集成指南】Web端常见问题整理
  15. UML正日薄西山的13个理由
  16. C++使用Clipper库
  17. edge浏览器如何把网页放到桌面_如何在桌面创建Win10 Edge浏览器快捷方式
  18. 【题解】CQ大神原创的一道题
  19. 应届毕业生找Python工作遇到的难题,刚毕业没有工作经验该怎么办?
  20. VSP编译工具链安装

热门文章

  1. java设计模式之九外观模式(Facade)
  2. 《LeetCode力扣练习》剑指 Offer 10- I. 斐波那契数列 Java
  3. 寄存器和存储器的区别_寄存器、累加器、暂存器都是什么?它们有什么区别?...
  4. java 分权分域什么意思_什么是分权分域管理?为什么要应用分权分域技术?
  5. mysql 创建date,在MySQL中从DATE和TIME创建DATETIME?
  6. sqlalchemy exists 子查询_学好ORM框架SQLAlchemy面试必问
  7. python 模拟用户点击浏览器_Python-模拟浏览器-下载文献
  8. python删除类方法_python中向类中动态添加新特性及删除属性方法
  9. linux ext4 img解包打包教程,解打包.img.ext4(转)
  10. 3.MOC文件解读(下)——MOC文件中的函数