c#委托与事件(二)
這篇博客是在上篇的基礎開始講述了一下委托的一些用法,首先我舉一個例子說明了一下前面章節的知識點,接下來我說了將方法作為參數傳遞的一個案例,接下來實現了一個委托實現冒泡排序的方法,如果你們和我一樣正在學習,希望能夠把代碼詳細的看一下,我感覺還是有幫助的,最后講述一下回調函數的例子,學習編程做好的方法就是從代碼中學習,所以我列舉了很多代碼,希望我們共同學習
1. 新建一個項目
(1)新建一個控制臺項目,實現利用委托來實現多態的實現,
(2)委托可以將方法定義成變量來使用,所以可以實現統一調用不同實現
(3)舉例說明一下:記得大學的時候老師讓我們做過一個面試題,說是用委托實現如下功能,主人回家了,燈亮了,貓叫了,老鼠被逮著了,iphone5S出來了,有人有少腎了 ,下面我就寫一下這道題的代碼吧
?
1 public delegate void FuncDelagete(); 2 3 class Program 4 5 { 6 7 static void Main(string[] args) 8 9 { 10 11 Console.Write("請選擇1:主人,2貓,3Iphone:"); 12 13 //定義一個委托變量 14 15 FuncDelagete GetChoose; 16 17 //就是裝配委托變量的方法 18 19 switch (Console.ReadLine()) 20 21 { 22 23 case "1": 24 25 GetChoose = Master; 26 27 break; 28 29 case "2": 30 31 GetChoose = Cat; 32 33 break; 34 35 case "3": 36 37 GetChoose = Iphone; 38 39 break; 40 41 default: 42 43 GetChoose = null; 44 45 break; 46 47 } 48 49 //調用委托變量指向的方法,如果沒有指向什么也不做 50 51 if (GetChoose != null) 52 53 { 54 55 GetChoose(); 56 57 } 58 59 Console.ReadKey(); 60 61 } 62 63 public static void Master() 64 65 { 66 67 Console.WriteLine("主人回家了,燈亮了"); 68 69 } 70 71 public static void Cat() 72 73 { 74 75 Console.WriteLine("貓叫了,老鼠被逮著了"); 76 77 } 78 79 public static void Iphone() 80 81 { 82 83 Console.WriteLine("iphone出來了,有人有少腎了"); 84 85 } 86 87 }
2. 將方法作為參數傳遞使用,先舉個例子如下:
???
1 public delegate void FuncDelegate(); 2 3 class Program 4 5 { 6 7 static void Main(string[] args) 8 9 { 10 11 FuncDelegate myFunc = new FuncDelegate(Func); 12 13 Chinese(myFunc); 14 15 //等價于Chinese(Func); 16 17 //等價于Chinese(new FuncDelegate(Func)); 18 19 Console.ReadKey(); 20 21 } 22 23 //原始的,需要被當作參數來傳遞的 24 25 public static void Func() 26 27 { 28 29 Console.WriteLine("釣魚島是我們的,就是我們的參數,我們要傳到中國去"); 30 31 } 32 33 //傳入什么方法,就直接執行這個方法 34 35 public static void Chinese(FuncDelegate target) 36 37 { 38 39 if (target != null) 40 41 { 42 43 target(); 44 45 } 46 47 } 48 49 }
??? //注:這只是一個演示的小案例,舉得例子感覺有點不太好,但是因為這段時間是特殊日期嗎,能看懂就行
說明:
(1) 將方法作為一個參數,傳到另一個方法中執行,那么另一方法就可以作為一個執行的載體,他不管具體要干什么,只考慮自己的獨有邏輯,可變化的方法有傳入的方法執行
(2) 下面我們考慮這樣一個練習:用冒泡對一個字符串進行排序,用數字的形式去排序,按照字符串的長度去排序,如果我們不使用委托事項的話我們的代碼可以這樣寫,當然寫出這個程序的代碼很多,我就只按照我的寫一遍
1 class Program 2 3 { 4 5 static void Main(string[] args) 6 7 { 8 9 string[] strArr = { "232", "43", "65", "76", "87", "46" }; 10 11 //用冒泡對這個字符串進行排序 12 13 //用數字的形式去排序 14 15 //按照字符串的長度去排序 16 17 OrderNum(strArr); 18 19 OrderString(strArr); 20 21 22 23 Console.ReadKey(); 24 25 } 26 27 //按照數字的方式去排序 28 29 public static void OrderNum(string[] nums) 30 31 { 32 33 for (int i = 0; i < nums.Length - 1; i++) 34 35 { 36 37 for (int j = 0; j < nums.Length - 1 - i; j++) 38 39 { 40 41 if (Convert.ToInt32(nums[j]) > Convert.ToInt32(nums[j + 1])) 42 43 { 44 45 string temp = nums[j]; 46 47 nums[j] = nums[j + 1]; 48 49 nums[j + 1] = temp; 50 51 } 52 53 } 54 55 } 56 57 } 58 59 //按照字符串的方式排序 60 61 public static void OrderString(string[] nums) 62 63 { 64 65 for (int i = 0; i < nums.Length - 1; i++) 66 67 { 68 69 for (int j = 0; j < nums.Length - 1 - i; j++) 70 71 { 72 73 if (string.Compare(nums[j], nums[j + 1]) > 0) 74 75 { 76 77 string temp = nums[j]; 78 79 nums[j] = nums[j + 1]; 80 81 nums[j + 1] = temp; 82 83 } 84 85 } 86 87 } 88 89 } 90 91 } 92 93 下面我用方法傳參的方式寫一下上面所實現的代碼:代碼如下: 94 95 public delegate bool CompareDelegate(string s1,string s2); 96 97 class Program 98 99 { 100 101 static void Main(string[] args) 102 103 { 104 105 string[] strArr = { "232", "43", "65", "76", "87", "46" }; 106 107 //用冒泡對這個字符串進行排序 108 109 //用數字的形式去排序 110 111 //按照字符串的長度去排序 112 113 Order(strArr, CompareNum); 114 115 Order(strArr, CompareString); 116 117 Console.ReadKey(); 118 119 } 120 121 //通用方法對字符串數組進行排序,排序的規則有傳入的方法決定 122 123 public static void Order(string[] nums,CompareDelegate target) 124 125 { 126 127 for (int i = 0; i < nums.Length - 1; i++) 128 129 { 130 131 for (int j = 0; j < nums.Length - 1 - i; j++) 132 133 { 134 135 if (target(nums[j], nums[j + 1])) 136 137 { 138 139 string temp = nums[j]; 140 141 nums[j] = nums[j + 1]; 142 143 nums[j + 1] = temp; 144 145 } 146 147 } 148 149 } 150 151 } 152 153 //按照數字的方式去排序 154 155 private static bool CompareNum(string str1, string str2) 156 157 { 158 159 return Convert.ToInt32(str1) > Convert.ToInt32(str2); 160 161 } 162 163 //按照字符串的方式排序 164 165 private static bool CompareString(string str1, string str2) 166 167 { 168 169 return string.Compare(str1, str2) > 0; 170 171 } 172 173 }
->方法作為參數傳遞-回調函數
(1)在回調函數里面私有方法照樣被訪問,下面我們通過一個例子來說明一下,這段代碼要仔細的看哦,
由于跳轉的很厲害,所以看不懂的話可以加斷點實驗一下:
?
1 public delegate void FuncDelagete(); 2 3 class Program 4 5 { 6 7 static void Main(string[] args) 8 9 { 10 11 MyClassCol mc=new MyClassCol(); 12 13 mc.Initialize(); 14 15 mc.Run(); 16 17 Console.ReadKey(); 18 19 } 20 21 } 22 class MyClassCol 23 24 { 25 26 MyClass m; 27 28 public void Initialize() 29 30 { 31 32 m = new MyClass(); 33 34 m.Target = Func; 35 36 } 37 public void Run() 38 39 { 40 41 m.Run(); 42 43 } 44 private void Func() 45 46 { 47 48 Console.WriteLine("我是回調方法"); 49 50 } 51 52 } 53 54 //這個類實現回調 55 56 class MyClass 57 58 { 59 60 FuncDelagete target; 61 62 public FuncDelagete Target 63 64 { 65 66 get { return target; } 67 68 set { target = value; } 69 70 } 71 72 public void Run() 73 74 { 75 76 if (target != null) 77 78 { 79 80 target(); 81 82 } 83 84 } 85 86 }
轉載于:https://www.cnblogs.com/czsl/archive/2012/09/17/2688355.html
總結
以上是生活随笔為你收集整理的c#委托与事件(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 男孩起名字好听的字
- 下一篇: 求一个伤感的qq网名男生!