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 }