读书笔记c#高级编程委托和事件

笔记|编程|高级

 
在C#中使用一个类时,分两个阶段。首先需要定义这个类,即告诉编译器这个类由什么字段和方法组成。然后(除非只使用静态方法)实例化类的一个对象。使用委托时,也需要经过这两个步骤。首先定义要使用的委托,对于委托,定义它就是告诉编译器这种类型代表了那种类型的方法,然后创建该委托的一个或多个实例。
定义委托是从delegate开始的然而它是如何运作的呢。也许弄个鼠标事件会容易理解一些,这里还是拿出书中的例子来。

using System;

namespace Wrox.ProfCSharp.AdvancedCSharp
{
   delegate bool CompareOp(object lhs, object rhs);

   class MainEntryPoint
   {
      static void Main()
      {
         Employee [] employees =
            {
                  new Employee("Karli Watson", 20000),
               new Employee("Bill Gates", 10000),
               new Employee("Simon Robinson", 25000),
               new Employee("Mortimer", (decimal)1000000.38),
               new Employee("Arabel Jones", 23000),
               new Employee("Avon from 'Blake's 7'", 50000)};
         CompareOp employeeCompareOp = new CompareOp(Employee.RhsIsGreater);
         BubbleSorter.Sort(employees, employeeCompareOp);

         for (int i=0 ; i<employees.Length ; i++)
            Console.WriteLine(employees[i].ToString());
         Console.ReadLine();
      }
   }

   class Employee // : object
   {
      private string name;
      private decimal salary;

      public Employee(string name, decimal salary)
      {
         this.name = name;
         this.salary = salary;
      }

      public override string ToString()
      {
         return string.Format(name + ", {0:C}", salary);
      }

      public static bool RhsIsGreater(object lhs, object rhs)
      {
         Employee empLhs = (Employee) lhs;
         Employee empRhs = (Employee) rhs;
         return (empRhs.salary > empLhs.salary) ? true : false;
      }
   }

   class BubbleSorter
   {
      static public void Sort(object [] sortArray, CompareOp gtMethod)
      {
         for (int i=0 ; i<sortArray.Length ; i++)
         {
            for (int j=i+1 ; j<sortArray.Length ; j++)
            {
               if (gtMethod(sortArray[j], sortArray[i]))
               {
                  object temp = sortArray[i];
                  sortArray[i] = sortArray[j];
                  sortArray[j] = temp;
               }
            }
         }
      }
   }
}

using System;

namespace Wrox.ProfCSharp.AdvancedCSharp
{
   delegate bool CompareOp(object lhs, object rhs);

   class MainEntryPoint
   {
      static void Main()
      {
         Employee [] employees =
            {
                  new Employee("Karli Watson", 20000),
               new Employee("Bill Gates", 10000),
               new Employee("Simon Robinson", 25000),
               new Employee("Mortimer", (decimal)1000000.38),
               new Employee("Arabel Jones", 23000),
               new Employee("Avon from 'Blake's 7'", 50000)};
         CompareOp employeeCompareOp = new CompareOp(Employee.RhsIsGreater);
         BubbleSorter.Sort(employees, employeeCompareOp);

         for (int i=0 ; i<employees.Length ; i++)
            Console.WriteLine(employees[i].ToString());
         Console.ReadLine();
      }
   }

   class Employee // : object
   {
      private string name;
      private decimal salary;

      public Employee(string name, decimal salary)
      {
         this.name = name;
         this.salary = salary;
      }

      public override string ToString()
      {
         return string.Format(name + ", {0:C}", salary);
      }

      public static bool RhsIsGreater(object lhs, object rhs)
      {
         Employee empLhs = (Employee) lhs;
         Employee empRhs = (Employee) rhs;
         return (empRhs.salary > empLhs.salary) ? true : false;
      }
   }

   class BubbleSorter
   {
      static public void Sort(object [] sortArray, CompareOp gtMethod)
      {
         for (int i=0 ; i<sortArray.Length ; i++)
         {
            for (int j=i+1 ; j<sortArray.Length ; j++)
            {
               if (gtMethod(sortArray[j], sortArray[i]))
               {
                  object temp = sortArray[i];
                  sortArray[i] = sortArray[j];
                  sortArray[j] = temp;
               }
            }
         }
      }
   }
}

代码中,首先声明了一个delegate bool CompareOp(object lhs, object rhs)委托,再说说委托:
委托机制是促使事件发送与事件接受的一种对接策略,对象对周围信号的反应或在一定环境中所具备的对其它对象的通知行为的响应则被描述成所谓的“事件”,这可以类比人对周围世界反馈产生信号的能力。委托就是一种定向信号流:指定产生、接受信号者并产生信号反馈的技术。那么这段委托是怎么把程序连动起来的呢,看后面的代码。
首先是CompareOp employeeCompareOp = new CompareOp(Employee.RhsIsGreater)这里就象定义了一个监听装置,一旦发生了CompareOp(object lhs, object rhs)这个事件就去执行Employee.RhsIsGreater的代码。
接下来我们就去看看Employee.RhsIsGreater里面的东西。

public static bool RhsIsGreater(object lhs, object rhs)
{
     Employee empLhs = (Employee) lhs;
     Employee empRhs = (Employee) rhs;
     return (empRhs.salary > empLhs.salary) ? true : false;
}

public static bool RhsIsGreater(object lhs, object rhs)
{
     Employee empLhs = (Employee) lhs;
     Employee empRhs = (Employee) rhs;
     return (empRhs.salary > empLhs.salary) ? true : false;
}
也就是说RhsIsGreater的参数是匹配CompareOp存在的,参数中没有直接使用Employee这个type而是采用了一种通用的做法,全都弄成object需要的时候再做转换,暂时还无法理解其深远的意义,先记着了。估计是定义委托时不能用这些自定义的type吧。
那么这段代码是什么时候运行的呢,注意看这段


static public void Sort(object [] sortArray, CompareOp gtMethod)
{
   for (int i=0 ; i<sortArray.Length ; i++)
   {
        for (int j=i+1 ; j<sortArray.Length ; j++)
        {
           if (gtMethod(sortArray[j], sortArray[i]))
           {
              object temp = sortArray[i];
              sortArray[i] = sortArray[j];
              sortArray[j] = temp;
           }
        }
   }
}

其中static public void Sort(object [] sortArray, CompareOp gtMethod)的参数里就有这种我们委托好的CompareOp了。也就是说一旦运行到if (gtMethod(sortArray[j], sortArray[i]))系统就会去找CompareOp employeeCompareOp = new CompareOp(Employee.RhsIsGreater);然后找public static bool RhsIsGreater(object lhs, object rhs)这样就执行到里面的代码了。
整个事件响应完成。

时间: 2024-08-15 01:59:52

读书笔记c#高级编程委托和事件的相关文章

《Java 手机/PDA 程序设计入门》读书笔记3--LCDAUI高级API之List

笔记|程序|高级|设计 Screen类有四个子类: Alert List TextBox Form List根据Choice接口的定义,分为:Choice.Exclusive(单选)Choice.MULTIPLE(多选)Choice.IMPLICIT(简易式的单选) 单选型Image img=Image.createImage("/a.png");List l=new List("List test",Choice.Exclusive);l.append("

《Java 手机/PDA 程序设计入门》读书笔记5--LCDAUI高级API之Alert

笔记|程序|高级|设计 AlertType是工具类,本身不能实例化.它提供了几个定义好的AlertYtpe以辅助Alert类使用.包括:ALARM 警报CONFIRMATION 确定ERROR 错误INFO 提供信息WARNING 警告 警告音:Display display;AlertType.ALARM.playSound(display);AlertType.CONFIRMATION.playSound(display);AlertType.ERROR.playSound(display)

Android高级编程笔记(四)深入探讨Activity(转)

在应用程序中至少包含一个用来处理应用程序的主UI功能的主界面屏幕.这个主界面一般由多个Fragment组成,并由一组次要Activity支持.要在屏幕之间切换,就必须要启动一个新的Activity.一般的Activity都占据了整个显示屏,但可以创建成半透明或二者浮动的Activity. 一.创建Activity 通过继承Activity类可以创建一个Activity窗口,基本框架如下: 1 public class MyActivity extends Activity { 2 @Overri

第十一章 事件[《.net框架程序设计》读书笔记]

.net框架|笔记|程序|设计 第十一章 事件 摘要: ?????? 本章讲述事件的应用,包括: n???????? 发布事件设计模式 n???????? 侦听事件的方法 n???????? 显式控制事件注册 n???????? 一个类型定义多个事件并减少内存资源 ? 一.???????????? 发布事件 1.发布事件的类型提供的功能: l???????? 允许其他对象登记事件 l???????? 允许其他对象注销事件 l???????? 维护一个登记对象列表,在事件发生时通知相应的登记对象

C#3.0笔记(二)预备知识之委托与事件

在上篇blog中简单地介绍了委托的基础知识,在这片文章中会介绍下委托跟 事件之间的联系. 事件的由来 我们可以看到在使用委托进行回调 的实现的时候,我们往往需要再定义一个委托对象,以及一个对外公开的辅助方 法来添加委托的方法,这样子会使我们感觉比较繁琐.C#提供了event关键字来 减轻直接使用委托的负担,编译器会自动提供注册.取消注册的方法和委托必要 的成员.首先来看看定义事件的步骤: 1.先定义委托类型: 2.通 过event关键字定委托类型的事件. public delegate int

《多核编程的艺术》读书笔记

感谢网友 郑思遥 投递本稿. 这份笔记是我2013年下半年以来读"The Art of Multiprocessor Programming"这本书的读书笔记.目前有关共享内存并发同步相关的书籍并不多,但是学术文献却不少,跨越的时间范围也非常长,说明人们一直在做出努力. 这本书是这个领域的好书,作为一本好书,它总结了这个领域自发展以来的大量重要成果,介绍了共享内存同步的基本理论,并介绍了大量并发算法和数据结构(主要是无锁算法),包括并发队列.栈.链表.计数器.排序网络.散列.跳表.优先

C# 编写的com(按照C#高级编程中的方法写了所谓的连接点) c++如何将函数与事件关联起来 ?? 高手请进..........

问题描述 C#代码:是按照<C#高级编程>中的方法写的下面的IEvent接口里的方法名与后面的Class1中的事件名相同...而且Class1有特性[ComSourceInterfaces(typeof(IEvent))]据书上说这样就可以供C++来连接了.我想的就是C++写好一个函数然后这个函数就是Class1中的事件LoginOk的处理函数就和C#里用LoginOk+=....一样.但是我就是不明白怎么把C++的方法和这个Class1的事件联系起来而且这个IEvent也完全没用到...us

编程中无法回避的基础知识---委托和事件

编程中无法回避的基础知识---委托和事件          在C#开发中,有时我们需要实现这样的情况:只要新添加一个对象,就要执行一系列的方法.如果每次挨个调用,这样既浪费时间,又造成代码冗余.这个时候我们就可以使用委托来建立一个方法链条,设置好后,可以让一个对象依次去执行这个链条上的各个方法.这样的结果就是:简化了代码,提高了效率,提高了代码的可维护性.        究竟什么是委托呢?事件有何委托有什么关系呢?          一.定义          委托是一个类,它定义了方法的类型,

JavaScript高级程序设计 读书笔记之八 Function类及闭包_javascript技巧

Function类 定义 Function类可以表示开发者定义的任何函数,用Function类直接创建函数的语法如下: var function_name=new Function(agrument1,agrument2,...,argumentN,function_body); 每个argument都是一个参数,最后一个参数是函数主体(要执行的代码). 示例: 复制代码 代码如下: function sayHi(sName,sMessage){ alert("Hello "+sNam