首页 > 代码库 > C#语言进阶——4.C# 的委托

C#语言进阶——4.C# 的委托

1.C# 中通过委托调用静态方法

简述:

委托就像c++里面的函数指针,比如有时候我们要调用一个方法,但我们在编译的时候并不知道那个方法将要被调用,在具体执行的时候才确定那个方法被调用,这相当一个佚名的方式。比如说我们在写的时候就留下一个可能性在后来,他可以去调其他的各种方法去执行、而c#的委托要比c++更加强大,因为他是面向对象的,他的类型是安全的。c++里面的函数指针直接指向一个函数,并没有什么特别的要求,但是在c#语言中 委托具体的函数 参数 返回值都是确定的,都在委托里面定义好的。

C#中所有的委托都是一个类 System.Delegate 委托的好处:刚开始我只知道我需要这么个类型的方法,在具体需要那个方法的时候直接像传递参数一样传进去就可以了。

C#中的委托是实现C#中的事件,以及回调函数的一个基础。

 1         delegate int NumerChanger(int n);//首先申明一个委托
 2         static int nmu = 10;
 3         static void Main(string[] args)
 4         {
 5             NumerChanger nc1 = new NumerChanger(AddNum);       //实例化一个委托 ,把符合方法格式:AddNum的传进来
 6             nc1(25);
 7 
 8             Console.WriteLine("{0}",nmu);
 9             Console.ReadKey();
10 
11 
12         }
13 
14         public static int AddNum(int p)
15         {
16             nmu += p;
17             return nmu;
18         }

 

2.C# 中通过委托调用实例化方法

 1     class Program
 2     {
 3 
 4         delegate int NumerChanger(int n);//首先申明一个委托
 5         static int nmu = 10;
 6         static void Main(string[] args)
 7         {
 8             //静态
 9             NumerChanger nc1 = new NumerChanger(AddNum);       //实例化一个委托 ,把符合方法格式:AddNum的传进来
10             nc1(25);
11             Console.WriteLine("{0}",nmu);
12             //实例化
13             MyClass mc = new MyClass(); //首先先实例化这个方法
14             NumerChanger nc2 = new NumerChanger(mc.AddNum);
15             nc2(35);
16             Console.WriteLine("{0}", mc.num);
17             Console.ReadKey();
18 
19 
20         }
21         //静态方法
22         public static int AddNum(int p)
23         {
24             nmu += p;
25             return nmu;
26         }
27     }
28     class MyClass
29     {
30         public int num = 10;
31         public int AddNum(int p)
32         {
33             num += p;
34             return num;
35         }
36     }

 

3.C# 的 multi-casting delegate(多重委托)

简述: 委托的调用其实是个列表,他可以同时调用多个方法,这就是一个多重委托

 1     class Program
 2     {
 3         /// <summary>
 4         /// 多重委托(multi-casting delegate):可以调用多个委托,也可以减去删掉里面的委托,他的具体执行顺序是列表从头到位按顺序执行的
 5         /// </summary>
 6         /// <param name="args"></param>
 7         delegate void D(int x);//申明一个委托
 8         static void Main(string[] args)
 9         {
10 
11             D cd1 = new D(C.M1);
12             cd1(-1);
13             Console.WriteLine();
14 
15             D cd2 = new D(C.M2);
16             cd1(-2);
17             Console.WriteLine();
18 
19             D cd3 = cd1 + cd2;
20             cd3(10);
21             Console.WriteLine();
22 
23             C c = new C();
24             D cd4 = new D(c.M3);
25             cd3 += cd4;
26             cd3(30);
27             Console.WriteLine();
28 
29             cd3 += cd1;
30             cd3(20);
31             Console.WriteLine();
32             cd3 -= cd1; //-=是从后面执行
33             cd3(40);
34 
35             Console.ReadKey();
36 
37 
38 
39         }
40 
41     }
42 
43     class C
44     {
45         public static void M1(int i)
46         {
47             Console.WriteLine("c.m1:" + i);
48         }
49         public static void M2(int i)
50         {
51             Console.WriteLine("c.m2:" + i);
52         }
53 
54         public void M3(int i)
55         {
56             Console.WriteLine("c.m3:" + i);
57         }
58     }

 

C#语言进阶——4.C# 的委托