日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

c#委托与事件(二)

發布時間:2023/11/27 生活经验 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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#委托与事件(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。