代码改变世界

便于自我理解delegate委托

2016-11-11 15:45  本冶寺  阅读(137)  评论(0)    收藏  举报
  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 
  6 namespace DawaNote
  7 {
  8     //delegate 命名规则 
  9     //1.  xxHandler
 10     //2.  xxEventHandler
 11     //
 12     //delegate 可以在类外部声明即命名空间中直接声明
 13     //event 是用来修饰delegate实例的,不可用来修饰delegate
 14     //event 是一种特殊的delegate实例
 15     //delegate 可以理解为一种特殊的类,故而可以在命名空间中声明,实例化委托的过程类比于类的实例化。
 16     //public delegate void NamespaceHandler(string str);类似于类的声明
 17     //public static NamespaceHandler StaticWrite;类似于变量的声明
 18     //StaticWrite = OnWrite2;类似于变量的初始化。
 19     //StaticWrite("test");理解为变量的一个方法的执行,如果变量为null,则无法执行方法。
 20 
 21     public delegate void NamespaceHandler(string str);
 22 
 23 
 24     class Program
 25     {
 26         static void Main(string[] args)
 27         {
 28             MyDelegates myDelegates = new MyDelegates();
 29             myDelegates.Test3();
 30             //myDelegates.WriteEvent += Write;
 31             //myDelegates.Write2 += Write;
 32             //myDelegates.Write2("Write2");
 33             //编译不通过,event只能在声明类中调用
 34             //myDelegates.WriteEvent("WriteEvent");
 35             Console.Read();
 36         }
 37 
 38 
 39 
 40         static void Write(string str)
 41         {
 42             Console.WriteLine("Program.Write: " + str);
 43         }
 44 
 45     }
 46     public class MyDelegates
 47     {
 48 
 49         //类内部定义委托
 50         public delegate void ClassHandler(string str);
 51 
 52         //声明静态委托
 53         public static NamespaceHandler StaticWrite;
 54         public static ClassHandler StaticWrite2;
 55 
 56         //声明普通委托
 57         public NamespaceHandler Write;
 58         public ClassHandler Write2;
 59         public ClassHandler Write3;
 60 
 61         //event只能在类下声明,无法在方法下声明,普通委托则无此限制
 62         //event只能在声明类中调用,在外部类中只能使用+=,-=,普通委托则无此限制
 63         public event ClassHandler WriteEvent;
 64 
 65         public void Test()
 66         {
 67             //event ClassHandler WriteEvent; //编译不通过
 68             WriteEvent += OnWrite2;
 69             //在声明类内部调用事件
 70             WriteEvent("event");
 71         }
 72 
 73 
 74         //委托是一种数据类型(引用类型)
 75         //Write3会执行Write2所有的方法,可以理解为委托是引用类型类型,类似于Write3是Write2的普通的引用类型
 76         public void Test1()
 77         {
 78             Write2 = OnWrite;
 79             Write2 += OnWrite2;
 80             Write3 = Write2;
 81             Write2("Write2");
 82             Write3("Write3");
 83         }
 84 
 85         //Write3 赋值需要在Write2实例化之后进行(+= ,=),否则报:未将对象引用设置到对象的实例。
 86         public void Test2()
 87         {
 88             #region 错误的写法
 89 
 90             //Write2未初始化,相当于null,次语句与Write3 = null;等同
 91             Write3 = Write2;
 92             //Write2初始化,相当于new 构造。
 93             Write2 = OnWrite;
 94             Write2("Write2");
 95             //以此异常,因为 Write3 = null;故而报异常:未将对象引用设置到对象的实例。
 96             Write3("Write3");
 97             
 98             #endregion
 99 
100             #region 正确的写法
101 
102             Write2 = OnWrite;
103             Write3 = Write2;
104             Write2("Write2");
105             Write3("Write3");
106             
107             #endregion
108 
109         }
110 
111         // = 与 +=
112         public void Test3()
113         {
114             Write2 = null;
115             //Write2初始化,相当于new 构造。  
116             //当Write2=null时,第一个+=会后台会自动初始化Write2   Write2 = OnWrite;与  Write2 += OnWrite;结果相同
117             Write2 = OnWrite;
118             Write2 += OnWrite;
119             Write2 += OnWrite;
120             //+=,Write2进行多委托,进而多次执行OnWrite方法,此处执行3次打印功能
121             Write2("Write2");
122             Console.WriteLine("------------------------------");
123             //Write2初始化,相当于new 构造。
124             //此处执行一次打印
125             Write2 = OnWrite;
126             Write2("Write2");
127 
128         }
129 
130         public void OnWrite(string str)
131         {
132             Console.WriteLine("MyDelegates.Onwrite: " + str);
133         }
134         public void OnWrite2(string str)
135         {
136             Console.WriteLine("MyDelegates.OnWrite2: " + str);
137         }
138 
139     }
140 }