读书笔记(委托)

委托回调静态方法和实例方法有何区别

  •   当委托绑定静态方法时,内部的对象成员变量_target会被设置成null
  •   当委托绑定实例方法是,_target将会设置成指向该实例方法所属的一个实例对象
  •   当委托被执行时,该对象实例将会用来调用实例方法
 1 class DelegateReturn
 2     {
 3         public delegate String GetStringDelegate();
 4
 5         static string GetTypeName()
 6         {
 7             return typeof(DelegateReturn).ToString();
 8         }
 9         static string GetTimeString()
10         {
11             return DateTime.Now.ToString();
12         }
13         static void TestDelegate()
14         {
15             GetStringDelegate _myDelegate = new GetStringDelegate(GetTimeString);
16             _myDelegate += GetTypeName;
17
18             _myDelegate();
19             //1只有一个返回值,GetTypeName返回值
20             foreach (Delegate d in _myDelegate.GetInvocationList())
21                 Console.WriteLine(d.DynamicInvoke());
22             //2会有两个返回值
23         }
24     }

  链式委托的执行顺序是:按照委托链上的顺序从当前委托开始一次往后执行,如果有需要,可以通过GetInvocationList()方法来获得委托链上所有需要执行的委托,并且按照任何希望的顺序去执行它们。

  在上述第二种方法中,委托链中每个方法的返回值都不会丢失

  委托可以是带有返回值的方法,但多于一个带返回值的方法被添加到委托链中时,程序员需要受到地调用委托链上的每个方法,否则委托使用者将只能得到委托链上最后一个被执行方法的返回值

 1  /// <summary>
 2     /// 自定义一个事件类型参数
 3     /// </summary>
 4     public class ConsoleEventArgs : EventArgs
 5     {
 6         private string _message;
 7         public ConsoleEventArgs():base()
 8         {
 9             _message = String.Empty;
10         }
11         public ConsoleEventArgs(string message) :base()
12         {
13             _message = message;
14         }
15         public string Message
16         {
17             get
18             {
19                 return _message;
20             }
21         }
22     }
23
24     /// <summary>
25     /// 管理控制台,在输出前发出输出事件
26     /// </summary>
27     public class ConsoleEventManager
28     {
29         //定义控制台事件成员对象
30         public event EventHandler<ConsoleEventArgs> ConsoleEvent;
31         /// <summary>
32         /// 控制台输出
33         /// </summary>
34         /// <param name="message">用来构造事件参数</param>
35         public void ConsoleOutput(string message)
36         {
37             ConsoleEventArgs args = new ConsoleEventArgs(message);
38         }
39         /// <summary>
40         /// 负责发送事件
41         /// </summary>
42         /// <param name="args">事件参数</param>
43         public virtual void SendConsoleEvent(ConsoleEventArgs args)
44         {
45             //定义一个临时的引用变量,这样可以确保多线程访问时不会发生问题
46             EventHandler<ConsoleEventArgs> temp = ConsoleEvent;
47             if(temp != null)
48             {
49                 temp(this,args);
50             }
51         }
52     }
53     /// <summary>
54     /// 日志类型,订阅控制台输出事件
55     /// </summary>
56     public class Log
57     {
58         private const String LogFile = "C:\\TestLog.txt";
59         public Log(ConsoleEventManager cm)
60         {
61             //订阅控制台输出事件
62             cm.ConsoleEvent += WriteLog;
63         }
64         /// <summary>
65         /// 事件处理方法,注意参数固定模式
66         /// </summary>
67         /// <param name="sender">事件发送者</param>
68         /// <param name="args">事件参数</param>
69         private void WriteLog(object sender,EventArgs args)
70         {
71             if(!File.Exists(LogFile))
72             {
73                 using(FileStream fs = File.Create(LogFile)){}
74             }
75             FileInfo info = new FileInfo(LogFile);
76             using(StreamWriter sw = info.AppendText())
77             {
78                 sw.WriteLine(DateTime.Now.ToString()+"|"+sender.ToString()+"}"+((ConsoleEventArgs)args).Message);
79             }
80         }
81     }
  1. 定义了事件使用的参数类型 ConsoleEventArgs
  2. 定义了事件类型的私有成员 ConsoleEventManager.ConsoleEvent
  3. 定义了事件发送的方法 ConsoleEventManager.SendConsoleEvent
  4. 订阅事件 Log类型

  当程序执行时,ConsoleEventManager类型负责在控制台输出测试字符串,同时,订阅了控制台输出事件的Log类型会在日志文件中写入同样的内容

  事件是一种使用对象或者类能够通过提供通知的成员,客户端可以通过提供事件处理为相应的事件添加可执行代码,事件是一种特殊的委托

  事件是一个委托类型,该委托类型的方法无返回值,并且拥有两个参数,object TEventArg

  事件的订阅和取消都是基于委托链表来实现的

读书笔记(委托)

时间: 2024-10-29 04:00:15

读书笔记(委托)的相关文章

《C#图解教程》读书笔记之五:委托和事件

本篇已收录至<C#图解教程>读书笔记目录贴,点击访问该目录可获取更多内容. 一.委托初窥:一个拥有方法的对象 (1)本质:持有一个或多个方法的对象:委托和典型的对象不同,执行委托实际上是执行它所"持有"的方法.如果从C++的角度来理解委托,可以将其理解为一个类型安全的.面向对象的函数指针. (2)如何使用委托? ①声明委托类型(delegate关键字) ②使用该委托类型声明一个委托变量 ③为委托类型增加方法 ④调用委托执行方法 (3)委托的恒定性: 组合委托.为委托+=增加

关于委托自己的一些理解(作为读书笔记)

以前提到委托,总感觉不好理解,简单意义是上说委托可以理解为函数的指针,可以把一个方法作为一个参数带入到另一个方法中.本人理解,请大牛指 1.首先看一个简单的例子 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace DelegateDemo { public class Program { //声明一个猫叫,处理主人醒,老鼠跑 //public delegat

《Effective C++》读书笔记汇总

我之前边读<Effective C++>边写下每个条款的读书笔记,这一版是C++11之前的版本.这里我将每个条款令我印象深刻的点小结一下. 1.C++包括:Plain C(面向过程).OOP(面向对象).模板(泛型和模板元编程).STL(C++标准库). 2.用inline.enum.const代替#define.#define定义的宏,一旦复杂起来,高手都很难掌控.不要带入C的习惯. 3.灵活使用const前缀.不需要进行改变的数据加上const前缀.指针的const前缀有两种形式,cons

《你必须知道的.NET》读书笔记二:小OO有大原则

此篇已收录至<你必须知道的.Net>读书笔记目录贴,点击访问该目录可以获取更多内容. 一.单一职责原则 (1)核心思想:一个类最好只做一件事,只有一个引起它变化的原因 (2)常用模式:Facade模式.Proxy模式 (3)基本方法:Extract Interface 抽取接口.Extract Class 抽取类.Extract Method 抽取方法 (4)DEMO:数据库管理系统中根据不同权限进行CRUD操作(这里是使用Proxy模式重构后的代码)   (5)规则建议: ①一个类只有一个引

《C#高级编程》读书笔记

<C#高级编程>读书笔记 C#类型的取值范围 名称 CTS类型 说明 范围 sbyte System.SByte 8位有符号的整数 -128~127(−27−27~27−127−1) short System.Int16 16位有符号的整数 -32 768~32 767(−215−215~215−1215−1) int System.Int32 32位有符号的整数 -2 147 483 648~2 147 483 647(−231−231~231−1231−1) long System.Int

Effective Objective-C 读书笔记

一本不错的书,给出了52条建议来优化程序的性能,对初学者有不错的指导作用,但是对高级阶段的程序员可能帮助不是很大.这里贴出部分笔记: 第2条: 使用#improt导入头文件会把头文件的内容全部暴露到目标文件中,而且如果两个类之间存在循环引用则会出现编译错误,所以要尽量使用@class进行类声明. 如果需要实现一个协议,则必须#improt这个协议的头文件,所以可以将协议单独定义在一个.h文件当中.如果这个协议是代理模式协议的一部分,即需要与类捆绑使用才有实际意义,则建议定义在类当中,并以类名为前

【读书笔记】读《JavaScript设计模式》之观察者模式

一.定义 在事件驱动的环境中,比如浏览器这种持续寻求用户关注的环境中,观察者模式(又名发布者-订阅者(publisher-subscripber)模式)是一种管理人与其任务之间的关系(确切地讲,是对象及其行为和状态之间的关系)的得力工具.用JavaScript的话来说,这种模式的实质就是你可以对程序中某个对象的状态进行观察,并且在其发生改变时能够得到通知. 二.例子 我们需要一个发布者的构造函数,它为该实例定义了一个类型为数组的属性,用来保存订阅者的引用. function Publisher(

[.NET] 《Effective C#》读书笔记(二)- .NET 资源托管

<Effective C#>读书笔记(二)- .NET 资源托管 简介 续 <Effective C#>读书笔记(一)- C# 语言习惯. .NET 中,GC 会帮助我们管理内存,我们并不需要去担心内存泄漏,资源分配和指针初始化等问题.不过,它也并非万能,因为非托管资源需要我们自己进行清理,如文件句柄.数据库连接.GDI+ 对象和COM 对象等. 目录 十二.推荐使用成员初始化器而不是赋值语句 十三.正确地初始化静态成员变量 十四.尽量减少重复的初始化逻辑 十五.使用 using

《TCP/IP详解卷1:协议》第4章 ARP:地址解析协议-读书笔记

章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP:网际协议(1)-读书笔记 <TCP/IP详解卷1:协议>第3章 IP:网际协议(2)-读书笔记 <TCP/IP详解卷1:协议>第4章 ARP:地址解析协议-读书笔记 1.引言 当一台主机把以太网数据帧发送到位于同一局域网上的另一台主机时,是根据48 bit的以太网地址来确定目的接口的