谈到事件要先说说委托!什么是委托?其实我也不能讲它说的很明确。尽量的解释一下。
     我们如何定义方法?如何调用方法?先想想再继续下面的内容。

class Test
{
   static void Main()
   {
      string msg = "message";
      MethodName(msg);
   }
   static void MethodName(string msg)
   {
     //代码
   }
}

委托是一种引用方法的类型。委托定义出它想要代表的方法的原型,然后它可以和任何符合它所定义的方法的原型相关联。但使用委托时就犹如你在调用一个方法。看看委托如何被定义、实例化和使用的。

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    /**//// <summary>
    /// 定义一个委托。委托和类一样都是一种类型。只是委托所代表的是一种被定义好原型的方法。
    /// </summary>
    delegate void Mydeleg(string msg);
    class Program
    {
        static void Main(string[] args)
        {
            //实例化一个委托,也可以看成将一个委托和一个实际想要调用的方法关联起来。
            //其中new Mydeleg(GetMessage) 中的GetMessage是定义个方法的实例。你也可以将GetMessage换成GetMessage2
            //原因稍后将要进一步的讲解。
            Mydeleg methodRef = new Mydeleg(GetMessage);
            methodRef("The first message!");
            Console.Read();
        }
        static void GetMessage(string msgInfo)
        {
            Console.WriteLine(msgInfo);
        }
        static void GetMessage2(string msgInfo2)
        {
            Console.WriteLine(msgInfo2);
        }
    }
    class TestClass
    {
        public void GetMessage(string msg)
        {
            Console.WriteLine(msg);
        }
    }
}

通过委托的定义你会发现。定义一个委托就好像在定义个方法一样(形式上很类似)。你可以比较一下。
     定义一个委托:delegate 类型 委托名称(类型 参数名称, [类型 参数]) -- delegate void Mydeleg(string msg);
     定义一个方法:类型 方法名称(类型 参数名称, [类型 参数])-- void GetMessage(string msgInfo);
相似吗?是的。委托实际就是在定义它能够代表什么样的方法。如果这个方法符合委托所定义的方法“原型”我们就可以使用委托来调用那个方法。就是这样的。
    为什么需要使用委托呢?简单的为了调用一个方法吗(也许就是这么简单)?我认为不仅仅这样。如果你运行以上的方法你会发现你真的能够去调用一个方法并且不用知道这个方法到底是什么方法名。方法到底是什么?本质上说我认为方法不过是执行一段代码而已(不是吗?),可是方法一旦确定后就必须使用方法名来调用它。委托却不需要这样做。看看下面的例子吧

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    /**//// <summary>
    /// 定义一个委托。委托和类一样都是一种类型。只是委托所代表的是一种被定义好原型的方法。
    /// </summary>
    public delegate void Mydeleg(string msg);
    /**//// <summary>
    /// 假设这是一能够发送信息的类。我们可以通过这个类处理管理"信息的各种处理“。
    /// </summary>
    class Message
    {
        public Mydeleg deleg;
        public void Send(string message)
        {
            //表示我在发送信息前对信息做一定的加工。
            string result = "you have a message : " + message;
            //然后我们需要将这个信息发送。现在我在想一件事情。我要将信息怎么发送?发送到哪?
            //发生信息到手机, 那你需要在这里编写发送到手机上的代码逻辑
            //发送信息到邮箱, 那你需要在这里编写发送到邮箱上的代码逻辑
            //发送信息到QQ上,  那你需要在这里编写发送到QQ上的代码逻辑
            //或发送信息到手机并且邮箱、QQ中,又是相应的逻辑。
            //我还能列举很多。你现在要解决的问题是如果在不改变这个类的前提下你如何将信息发送到客户需要发送的地方。
            //我的想法是,使用委托。
            if (deleg != null)
                //调用这句你将发现实际是将外部定义的方法引用到这里。使你的方法拥有了在外部定义发送逻辑的能力。
                deleg(message);
        }
    }
}

下面展现了如果将外部的方法引用到Send方法内部来执行的能力。

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            //实例化message对象
            Message message = new Message();
            //设置message对象中的委托类型的成员变量。
            message.deleg = new Mydeleg(SendMobilePhone);
            //当调用这句的时候实际上在Send方法中附加了底下SendMobilePhone中包含的逻辑(发送方式的逻辑)。
            message.Send("I love you");
            Console.Read();
        }
        static void SendMobilePhone(string msg)
        {
            //表示发送到手机上的逻辑。
            Console.WriteLine( msg + " send to MobilePhone");
        }
    }
 
}

源代码:为什么使用委托
所以我认为委托是你动态的调用方法变成可能。而动态调用方法的意义就在于你可以在任意的地方插入任意的代码,灵活度大大提高。

转载于:https://www.cnblogs.com/travelcai/archive/2007/09/21/899362.html

讲讲C#中的事件和标准事件1--委托相关推荐

  1. offset、事件对象、事件鼠标的坐标、键盘事件、输入框放大显示的案例

    offset 翻译过来就是偏移量,我们使用offset系列相关属性可以动态的得到该元素 获得元素距带有定位父元素的位置 获得元素自身的大小(宽度高度) 注意:返回的数值都不带单位 offset系列属性 ...

  2. JavaScript中的事件传播(DOM2标准事件模型)

    在所有的现代浏览器当中--除了IE9之前的版本--都实现了DOM2标准事件模型,这个事件模型规定:每一个DOM元素所触发的事件都要经历三个阶段:一.捕获阶段:二.目标对象本身的事件处理程序调用阶段:三 ...

  3. javascript中的事件冒泡、事件捕获和事件执行顺序

    谈起JavaScript的 事件,事件冒泡.事件捕获.阻止默认事件这三个话题,无论是面试还是在平时的工作中,都很难避免. DOM事件标准定义了两种事件流,这两种事件流有着显著的不同并且可能对你的应用有 ...

  4. android 常用的监听器,Android中的Keyboard监听事件

    前言 有关Keyboard监听事件,无非就是以下这几种情况: 1,操作显示或隐藏键盘: 2,判断当前键盘的状态: 3,键盘显示或隐藏后的拦截处理: 只要有使用到EditText,避免不了肯定会遇到以上 ...

  5. html5 音频事件,HTML5中视频和音频核心事件的相关研究

    摘 要: 本文通过对HTML 5中视频和音频重要事件的研究,总结出HTML 5中重要事件在什么时候使用其中重要的相关属性,并以实例利用事件相关属性进行设置,给读者以相应启发. 关键字:HTML 5:视 ...

  6. js中事件捕获和事件冒泡

    全栈工程师开发手册 (作者:栾鹏) js系列教程8-事件操作全解 js中事件捕获和事件冒泡 其实不仅在js中,在面向对象的编程语言中或多或少涉及到这个问题.js编程的事件全解,你可以到我的主页,这里给 ...

  7. JS中onpropertychange事件和onchange事件区别

    2019独角兽企业重金招聘Python工程师标准>>> 当一个HTML元素的属性用js改变的时候,都能通过 onpropertychange来捕获.例如一个 <input na ...

  8. 标准事件模型和IE事件模型

    前言:在上一篇博客中总结了0级DOM事件模型和2级DOM事件模型,打铁趁热就在谈谈标准事件模型和IE事件模型的区别吧. 一. 标准事件模型 在JavaScript中把标准事件模型的执行分为三个阶段,即 ...

  9. java中action事件_Java中,()接口可以处理ActionEvent事件_学小易找答案

    [单选题]Test中已定义Public float m(float a,float b),在类Test中增加()方法将会编译错误 [单选题]如下代码,()可以使成员变量m被函数fun()直接访问 cl ...

  10. Qt中的消息通知和事件发送

    Qt 中的信号和槽机制.事件机制是其具有特色的两大机制.利用这两种机制可以轻松地实现需要的消息通知和事件通知. 1.信号和槽机制 充分使用 Qt 库中已经定义和实现好的对象的信号和槽函数,如按钮的 c ...

最新文章

  1. JVM----Java内存区域
  2. 逃离美股!瑞信给出了11个理由
  3. 2021年北京高校数学建模校际联赛题目 出版社图书印制策略
  4. Spark RDD使用详解2--RDD创建方式
  5. 理解并实施:GLBP(ccna200-120新增考点)
  6. mats显存测试软件linux环境,Mats显存检测软件下载-Mats显存检测软件最新版下载-微侠手游网...
  7. OMNeT学习之OMNeT安装与运行
  8. 终于有人把AI、BI、大数据、数据科学讲明白了
  9. 通过注册表快速清理残留的软件
  10. 苹果手用计算机解锁手机密码,苹果手机忘记密码怎样打开 苹果手机解锁常用方法分享...
  11. 英伟达显卡控制面板没有显示设置的三种解决方法
  12. 济南oracle 认证费用,济南ORACLE管理培训价格
  13. 平面/球面坐标中已知起点坐标、(偏转)角度、长度求终点坐标(三角函数)
  14. linux execl()函数
  15. iOS基础 UIWindow
  16. IntelliJ IDEA的数据库管理工具实在太方便了
  17. Android技术知识点:什么是外边距(margin)
  18. 算法 — 十六进制转八进制
  19. Vu单元测试-------笔记(一)
  20. iOS中UIControl的介绍

热门文章

  1. Jquery操作select选项集合,判断集合中是否存在option
  2. newInstance() 和 new 有什么区别
  3. 26种土的掉渣的东西,看你有多少
  4. http协议学习系列(转)
  5. 第一部分 第五章 数组 1102-1149
  6. canvas 从ondraw中获取_C# 在PDF中绘制多样风格的文本
  7. angler前端框架_Google前端框架AngularJS创始人Misko Hevery专访
  8. python模型参数估计_python – 从scipy.optimize.curve_fit获取与参数估计值相关的标准错误...
  9. python 对象_python中对象可不可以
  10. ip地址在c语言中长度是多少_c语言中(++i)+(++i)+(++i)究竟等于多少?