`
coconut_zhang
  • 浏览: 541907 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

读书笔记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;
               }
            }
         }
      }
   }
}

代码中,首先声明了一个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)这样就执行到里面的代码了。
整个事件响应完成。

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;
               }
            }
         }
      }
   }
}

分享到:
评论

相关推荐

    C#高级编程《第7版》读书笔记(7-9章).pdf

    ### C#高级编程《第7版》读书笔记(7-9章)——运算符和类型强制转换 #### 一、C#中的运算符 在C#编程语言中,运算符是一组预定义的符号,用来执行特定的计算任务。根据功能的不同,C#中的运算符大致可以分为以下几...

    C#教程 C#笔记 C#高级 C#知识点.rar

    C#是一种广泛应用于软件开发,尤其是Windows平台和.NET框架下的编程语言。本教程集合了我工作和学习过程中积累的C#各种知识点,旨在帮助你深入理解和掌握C#的基础及高级特性。 1. **C#基础知识** - **变量与数据...

    C#高级编程-学习笔记.pdf

    事件和事件处理程序是实现观察者模式的一种方式,允许松耦合的编程风格。 最后,函数成员(function members)提供了操作类数据的机制。函数成员包括方法、属性、构造函数和终结器、运算符和索引器等。方法类似于...

    C#网络编程基础

    在C#编程中,网络编程是一项至关重要的技能,它允许应用程序通过互联网与其他设备或服务进行通信。本课程“C#网络编程基础”旨在帮助初学者快速掌握网络编程的基本概念和实践技巧。 首先,我们从“委托机制”这个...

    C# 高级编程(第四版)笔记

    在C#编程中,委托和事件是两个核心概念,尤其在.NET Framework中扮演着至关重要的角色。理解并熟练运用它们对于提升C#开发能力至关重要。本文将通过实例逐步解析委托和事件的原理及应用。 首先,让我们从委托的概念...

    C# 课堂笔记 C# 课堂笔记

    C#是一种广泛应用于软件开发,尤其是游戏开发、桌面应用和Web服务领域的面向对象的编程语言。这组"课堂笔记"涵盖了C#的核心概念和技术,旨在帮助学习者深入理解和掌握这门语言。屏幕截图的添加可能意味着笔记中包含...

    C#-学习笔记

    在深入探讨"C#高级编程"的学习笔记之前,我们先来理解一下C#这...通过深入阅读和实践,你可以逐步提升自己的C#编程技能,成为一名出色的C#开发者。在学习过程中,建议结合实际项目练习,以巩固理论知识并提升实战经验。

    【精易C#编程基础】全套课堂笔记及源码

    7. **事件和委托**:讲解事件处理机制,包括事件发布者、订阅者和委托的概念,这对于创建用户界面和组件通信非常重要。 8. **异步编程**:掌握异步编程的基础,包括async/await关键字,以提高应用程序的响应性和...

    C#编程公开课开发笔记 学习知识概括 2014 07 09

    C#是一种广泛应用于软件开发的面向对象的编程语言,由...而《C#编程公开课开发笔记 学习知识概括 2014 07 09.txt》这个文件很可能是该课程的笔记整理,包含了关键概念和案例分析,对于复习和巩固所学知识非常有帮助。

    《C#与.NET3.0高级程序设计》读书笔记

    《C#与.NET3.0高级程序设计》是一本深入探讨C#编程语言和.NET Framework 3.0核心特性的专业书籍。这本书旨在帮助开发者掌握更高级的C#编程技巧和.NET 3.0框架的使用,从而提升软件开发的能力和效率。读书笔记主要...

    C#中的委托、事件学习笔记

    在C#编程语言中,委托和事件是两个非常重要的概念,它们主要用于实现对象之间的通信和回调机制。下面我们将深入探讨这两个主题。 1. 委托(Delegate) 委托在C#中扮演着函数指针的角色,它允许我们将方法作为参数...

    C#笔记和练习,C#笔记和练习

    这份文档可能包含了C#的基础语法和高级特性。C#的基础部分可能涵盖变量、数据类型(如int, string, bool等)、控制流(如if语句、for循环、while循环)、函数、类和对象的创建与使用。高级部分可能包括异常处理、...

    C#学习笔记(by sunyfun)

    最后,笔记可能会涵盖一些C#的高级特性,比如委托、事件和异步编程,以及LINQ(Language Integrated Query)的使用,这在现代C#开发中非常重要,特别是在处理大量数据时。 总的来说,这份【C#学习笔记(by sunyfun...

    C#使用手册+C#学习笔记+C#基础教程

    《C#使用手册+C#学习笔记+C#基础教程》是一份综合性的学习资源,适合对C#编程感兴趣的初学者和进阶者。这份压缩包包含了三个核心文档:《C#基础教程-c_实例教程.doc》、《C#使用手册.doc》和《C#学习笔记.doc》,...

    c#.net常用的小函数和方法集读书笔记

    这份读书笔记汇总了C#.NET中常见的高效、便捷的函数和方法,旨在帮助开发者更好地理解和运用这些工具,提高代码质量和可维护性。 一、字符串操作 字符串在编程中扮演着重要角色,C#.NET提供了丰富的字符串处理方法...

    C#学习笔记powerpoint版

    通常,第七章会涉及一些更复杂的主题,如接口、抽象类、委托、事件和异步编程。委托和事件是C#中处理回调和响应用户交互的关键,而异步编程则有助于改善应用程序的性能和响应性。 **学习建议** 对于初学者,按照...

    初学者可以用得着的C#笔记

    - 委托和事件(Delegate and Event):用于回调和异步编程。 - 并发和多线程(Concurrency and Multithreading):如Task类和Mutex/Semaphore同步原语。 8. **学习资源** - 官方文档:微软提供了详尽的C#语言...

    C#学习笔记(非常经典)

    Csharp.pdf这份文档可能涵盖了C#的基础知识和高级特性,比如: 1. **类与对象**:了解如何定义类、创建对象,以及如何通过属性和方法来操作对象。 2. **命名空间**:它是C#中组织代码的一种方式,有助于避免命名...

    《Visual C 网络编程》读书笔记模板.pptx

    《Visual C# 网络编程》读书笔记模板 Visual C# 网络编程是指使用 C# 语言进行网络编程的技术,涵盖了网络协议、 socket 编程、 Internet 应用编程等多个方面。下面是《Visual C# 网络编程》读书笔记模板中的知识点...

    C#学习笔记-C# Study Notes

    这是一份详尽的C#学习资源,旨在帮助初学者深入理解和掌握C#编程语言。这份笔记不仅包含了语言基础,还涵盖了从实际问题出发的学习过程,强调理解而非机械记忆,使得学习更加生动且具有实践意义。 一、C#语言基础 1...

Global site tag (gtag.js) - Google Analytics