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 }
时间: 2024-12-28 15:55:31