委托<一>
前几天在亚马逊买了几本.net 的书,其中包括一本《深入理解C#》 不容质疑,这是我看过的最好的一本介绍.net,推荐给所有进阶的.net程序员
一直都想系统的学习委托,今天刚好有时间,一边复习考试,一本学习准备实习。
闲话就不扯了,开始讲讲今晚的收获!
先简答介绍一下委托吧
在C#中,委托(delegate)是一种引用类型,在其他语言中,与委托最接近的是函数指针,但委托不仅存储对方法入口点的引用,还存储对用于调用方法的对象实例的引用。
委托的四个条件:
1.声明委托类型
2.必须有一个方法包含了要执行的代码
3.必学创建一个委托实例
4.必须调用(invoke)委托实例
值得注意的地方:
(1)委托也是一种类型,delegate void delegatetest(string input ) 这是一个委托声明,其实就是一个类型声明,我们可以吧delegate就看成是一个class ,这个class声明就想是一个函数,有函数的返回类型和函数的返回值。
(2)委托类型和委托实例是不同的概念,上面就是一个委托类型,委托实例也得用一个new创建;
(3)创建委托实例要指明回调方法(类型匹配)
(4)不要忘记执行委托
下面直接以一个简单的例子来说明委托的基本运用:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace ConsoleApplication1 7 { 8 9 delegate void StringProcess(string input); //1.声明委托类型 10 11 class person { 12 string name; 13 public person(string name){this.name=name;} 14 15 public void Say(string message) //2.必须有一个方法包含了要执行的代码 16 { 17 Console.WriteLine("{0} say: {1}",name,message); 18 } 19 } 20 21 class BackGround { 22 23 public static void Note(string message) //2.必须有一个方法包含了要执行的代码 24 { 25 Console.Write(message); 26 } 27 } 28 29 public class delegate1 30 { 31 public static void MainFunction() 32 { 33 person john = new person("john"); 34 person tom = new person("tom"); 35 36 BackGround noteSomething = new BackGround(); 37 38 StringProcess johnTest, tomTest, noteTest; //3.必学创建一个委托实例 39 johnTest = new StringProcess(john.Say); //给每个实例指定委托调用方法 40 tomTest = new StringProcess(tom.Say); //(指定实例方法) 41 noteTest = new StringProcess(BackGround.Note); //(指定静态方法) 42 43 44 johnTest("i am john"); //4.必须调用(invoke)委托实例 45 tomTest.Invoke("i am tome"); //编译的时候仍然会编译成 tomTest.Invoke("i am tome"); 46 noteTest("hi gile, i am coming"); //这个形式,但书写一般只需:johnTest("i am john"); 47 } 48 } 49 }
一天学习一点,慢慢积累! 期待更好的明天!