delegate关键字与Delegate类型
今天写了一个例子,能说明delegate和Delegate的不同,帖在下面,注释很全:
1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4 using System.Resources;
5 using System.Reflection;
6 using System.Globalization;
7
8 namespace ConsoleApplication
9 {
10 /*
11 * 在这个位置,由于delegate关键字,编译器会为我们生成一个类型 ConsoleApplication.TestDel (继承自System.MulticastDelegate)
12 * 而这个类型的构造器定义为:
13 * .method public hidebysig specialname rtspecialname
14 instance void .ctor(object 'object',
15 native int 'method') runtime managed
16 {
17 } // end of method TestDel::.ctor
18 */
19 delegate int TestDel(int i);
20
21 class UseDelegate
22 {
23 /*
24 * .method public hidebysig static string Compute(class ConsoleApplication.TestDel del,
25 int32 input) cil managed
26 */
27 public static string Compute(TestDel del, int input)
28 {
29 return del(input).ToString();
30 }
31
32 /*
33 * .method public hidebysig static string ComputeTwo(class [mscorlib]System.Delegate del,
34 int32 input) cil managed
35 */
36 public static string ComputeTwo(Delegate del, int input)
37 {
38 return null;
39 }
40 }
41
42
43 class Program
44 {
45 static void Main(string[] args)
46 {
47 int k = 5;
48
49 /*
50 * IL_0004: ldftn int32 ConsoleApplication.Program::MyMethodOne(int32)
51 IL_000a: newobj instance void ConsoleApplication.TestDel::.ctor(object,
52 native int)
53 IL_000f: ldloc.0
54 IL_0010: call string ConsoleApplication.UseDelegate::Compute(class ConsoleApplication.TestDel,
55 int32)
56 IL_0015: call void [mscorlib]System.Console::WriteLine(string)
57 */
58 Console.WriteLine(UseDelegate.Compute(MyMethodOne, k));
59 Console.WriteLine(UseDelegate.Compute(MyMethodTwo, k));
60
61 /*
62 * IL_0034: ldftn int32 ConsoleApplication.Program::MyMethodOne(int32)
63 IL_003a: newobj instance void ConsoleApplication.TestDel::.ctor(object,
64 native int)
65 IL_003f: ldloc.0
66 IL_0040: call string ConsoleApplication.UseDelegate::ComputeTwo(class [mscorlib]System.Delegate,
67 int32)
68 IL_0045: call void [mscorlib]System.Console::WriteLine(string)
69 */
70 Console.WriteLine(UseDelegate.ComputeTwo(new TestDel(MyMethodOne), k));
71
72 Console.Read();
73 }
74
75 private static int MyMethodOne(int i)
76 {
77 return (i++);
78 }
79
80 private static int MyMethodTwo(int i)
81 {
82 return (i--);
83 }
84
85 }
86
87 }
2 using System.Collections.Generic;
3 using System.Text;
4 using System.Resources;
5 using System.Reflection;
6 using System.Globalization;
7
8 namespace ConsoleApplication
9 {
10 /*
11 * 在这个位置,由于delegate关键字,编译器会为我们生成一个类型 ConsoleApplication.TestDel (继承自System.MulticastDelegate)
12 * 而这个类型的构造器定义为:
13 * .method public hidebysig specialname rtspecialname
14 instance void .ctor(object 'object',
15 native int 'method') runtime managed
16 {
17 } // end of method TestDel::.ctor
18 */
19 delegate int TestDel(int i);
20
21 class UseDelegate
22 {
23 /*
24 * .method public hidebysig static string Compute(class ConsoleApplication.TestDel del,
25 int32 input) cil managed
26 */
27 public static string Compute(TestDel del, int input)
28 {
29 return del(input).ToString();
30 }
31
32 /*
33 * .method public hidebysig static string ComputeTwo(class [mscorlib]System.Delegate del,
34 int32 input) cil managed
35 */
36 public static string ComputeTwo(Delegate del, int input)
37 {
38 return null;
39 }
40 }
41
42
43 class Program
44 {
45 static void Main(string[] args)
46 {
47 int k = 5;
48
49 /*
50 * IL_0004: ldftn int32 ConsoleApplication.Program::MyMethodOne(int32)
51 IL_000a: newobj instance void ConsoleApplication.TestDel::.ctor(object,
52 native int)
53 IL_000f: ldloc.0
54 IL_0010: call string ConsoleApplication.UseDelegate::Compute(class ConsoleApplication.TestDel,
55 int32)
56 IL_0015: call void [mscorlib]System.Console::WriteLine(string)
57 */
58 Console.WriteLine(UseDelegate.Compute(MyMethodOne, k));
59 Console.WriteLine(UseDelegate.Compute(MyMethodTwo, k));
60
61 /*
62 * IL_0034: ldftn int32 ConsoleApplication.Program::MyMethodOne(int32)
63 IL_003a: newobj instance void ConsoleApplication.TestDel::.ctor(object,
64 native int)
65 IL_003f: ldloc.0
66 IL_0040: call string ConsoleApplication.UseDelegate::ComputeTwo(class [mscorlib]System.Delegate,
67 int32)
68 IL_0045: call void [mscorlib]System.Console::WriteLine(string)
69 */
70 Console.WriteLine(UseDelegate.ComputeTwo(new TestDel(MyMethodOne), k));
71
72 Console.Read();
73 }
74
75 private static int MyMethodOne(int i)
76 {
77 return (i++);
78 }
79
80 private static int MyMethodTwo(int i)
81 {
82 return (i--);
83 }
84
85 }
86
87 }