《丁丁历险记系列之委托》-- 摘自http://www.cnblogs.com/xfxxx/archive/2010/04/03/1703839.html...
本文根據(jù)《.NET委托:一個(gè)C#睡前故事》改編,我的初衷是通過(guò)一個(gè)類似于小說(shuō)的模式,使用C#語(yǔ)言為背景,將編程的基礎(chǔ)知識(shí)以一種很容易理解的方式展現(xiàn)給初學(xué)者。
雖然我還有日常的工作要做,其中包括C#的培訓(xùn)工作(本文也是我曾經(jīng)用于培訓(xùn)學(xué)生時(shí)一堂課的內(nèi)容),但我會(huì)盡量抽時(shí)間,爭(zhēng)取陸續(xù)的推出該系列的其它姊妹篇。
下面的代碼使用起來(lái)非常簡(jiǎn)單的,直接粘貼到命令行項(xiàng)目中的Program中即可運(yùn)行,運(yùn)行有兩種模式,一種是單步運(yùn)行,修改?ExecuteStep(1);中的參數(shù)1-9
另一種是注釋該語(yǔ)句,取消注釋下面的for循環(huán)兩行,編譯運(yùn)行即可。而且,給讀者的感覺(jué)看代碼就像看小說(shuō)一樣有趣!
?
1 using System;2
3 ?class Market
4 {
5
6 #region 故事開(kāi)始
7
8 //從前,在南方一塊奇異的土地上,有個(gè)程序員名叫丁丁,他在一家知名的軟件公司M公司負(fù)責(zé)產(chǎn)品的市場(chǎng)促銷工作。
9 //他非常勤奮,對(duì)他的老板總是百依百順,但是他的老板從不信任別人,堅(jiān)決要求隨時(shí)知道丁丁的工作進(jìn)度,以防止他偷懶。
10 //丁丁是個(gè)喜歡思考的人,但是由于原先沒(méi)有經(jīng)驗(yàn),他只能自己摸索著一步一步的找到了完美的解決方案。
11 //下面,讓我們跟隨著丁丁的足跡,探尋他是怎樣成長(zhǎng)和進(jìn)步的。
12 ?
13 static void Main()
14 {
15 //您只需要修改下面的參數(shù)1-9,然后編譯運(yùn)行即可看到不同的運(yùn)行結(jié)果
16 ? ExecuteStep(1);
17 //或者使用這個(gè)循環(huán),遍歷所有結(jié)果
18 //for (int i = 1; i < 10; i++)
19 //ExecuteStep(i);
20 ? }
21
22 static void ExecuteStep(int step)
23 {
24 switch (step)
25 {
26 case 1: ED1_通知方法(); break;
27 case 2: ED2_接口(); break;
28 case 3: ED3_委托(); break;
29 case 4: ED4_靜態(tài)監(jiān)聽(tīng)者(); break;
30 case 5: ED5_事件(); break;
31 case 6: ED6_收獲所有結(jié)果(); break;
32 case 7: ED7_異步通知_激發(fā)(); break;
33 case 8: ED8_異步通知_輪詢(); break;
34 case 9: ED9_異步通知_回調(diào)(); break;
35 }
36 }
37
38 #endregion
39
40 #region 通知方法
41
42 //首先丁丁考慮的是怎樣能不讓老板呆在他的辦公室里站在背后盯著他,于是就對(duì)老板做出承諾:無(wú)論何時(shí),
43 //只要我的工作取得了一點(diǎn)進(jìn)展我都會(huì)及時(shí)讓你知道。
44 //丁丁通過(guò)周期性地使用“帶類型的引用(typed reference)”來(lái)“回調(diào)”他的老板來(lái)實(shí)現(xiàn)他的承諾:
45 ?
46 #region Boss1類
47 class Boss1
48 {
49 public void WorkStarted() { /* 老板不關(guān)心。*/ }
50 public void WorkProgressing() { /* 老板不關(guān)心。*/ }
51 public int WorkCompleted()
52 {
53 Console.WriteLine("老板評(píng)價(jià):仍需努力!給 1 分");
54 return 1; //總分為10
55 ? }
56 }
57 #endregion
58
59 #region Worker1類
60 class Worker1
61 {
62 Boss1 _boss;
63 public void Advise(Boss1 boss)
64 {
65 _boss = boss;
66 }
67
68 public void DoWork()
69 {
70 Console.WriteLine("丁丁:工作開(kāi)始");
71 if (_boss != null)
72 _boss.WorkStarted();
73
74 Console.WriteLine("丁丁:工作進(jìn)行中");
75 if (_boss != null)
76 _boss.WorkProgressing();
77
78 Console.WriteLine("丁丁:工作完成!自我打分: 3 分");
79 if (_boss != null)
80 {
81 int grade = _boss.WorkCompleted();
82 Console.WriteLine("丁丁的工作得分=" + grade);
83 }
84 }
85 }
86 #endregion
87
88 private static void ED1_通知方法()
89 {
90 Console.WriteLine("ED1_通知方法---------------------------------------");
91 Worker1 dingding = new Worker1();
92 Boss1 boss = new Boss1();
93 dingding.Advise(boss);
94 dingding.DoWork();
95 Console.WriteLine("公司消息:產(chǎn)品促銷工作順利結(jié)束!");
96 Console.ReadLine();
97 }
98
99 #endregion
100
101 #region 接口
102
103 //現(xiàn)在,丁丁成了一個(gè)特殊的人,他不但能容忍吝嗇的老板,而且和他周圍的市場(chǎng)中的客戶也有了密切的聯(lián)系,
104 //以至于他認(rèn)為市場(chǎng)中所有客戶對(duì)他的工作進(jìn)度也感興趣。不幸的是,他必須也給市場(chǎng)添加一個(gè)特殊的回調(diào)函數(shù)Advise
105 //來(lái)實(shí)現(xiàn)同時(shí)向他老板和市場(chǎng)報(bào)告工作進(jìn)度。丁丁想要把潛在的通知的列表和這些通知的實(shí)現(xiàn)方法分離開(kāi)來(lái),
106 //于是他決定把方法分離為一個(gè)接口:IWorkerEvents
107 ?
108 #region IWorkerEvents接口
109 public interface IWorkerEvents
110 {
111 void WorkStarted();
112 void WorkProgressing();
113 int WorkCompleted();
114 }
115 #endregion
116
117 #region Boss2類
118 class Boss2 : IWorkerEvents
119 {
120 public void WorkStarted() { /* 老板不關(guān)心。*/ }
121 public void WorkProgressing() { /* 老板不關(guān)心。*/ }
122 public int WorkCompleted()
123 {
124 Console.WriteLine("老板評(píng)價(jià):還可以!給 4 分");
125 return 4;
126 }
127 }
128 #endregion
129
130 #region Worker2類
131 class Worker2
132 {
133 public void Advise(IWorkerEvents events)
134 {
135 _events = events;
136 }
137
138 public void DoWork()
139 {
140 Console.WriteLine("丁丁:工作開(kāi)始");
141 if (_events != null)
142 _events.WorkStarted();
143 Console.WriteLine("丁丁:工作進(jìn)行中");
144 if (_events != null)
145 _events.WorkProgressing();
146 Console.WriteLine("丁丁:工作完成!自我打分: 4 分");
147 if (_events != null)
148 {
149 int grade = _events.WorkCompleted();
150 Console.WriteLine("丁丁的工作得分=" + grade);
151 }
152 }
153 private IWorkerEvents _events;
154 }
155 #endregion
156
157 private static void ED2_接口()
158 {
159 Console.WriteLine("ED2_接口---------------------------------------");
160 Worker2 dingding = new Worker2();
161 Boss2 boss = new Boss2();
162 dingding.Advise(boss);
163 dingding.DoWork();
164 Console.WriteLine("公司消息:產(chǎn)品促銷工作順利結(jié)束!");
165 Console.ReadLine();
166 }
167
168 #endregion
169
170 #region 委托
171
172 //不幸的是,這沒(méi)有解決問(wèn)題。每當(dāng)丁丁忙于通過(guò)接口的實(shí)現(xiàn)和老板交流時(shí),就沒(méi)有機(jī)會(huì)及時(shí)通知市場(chǎng)了。
173 //至少他不能忽略身在遠(yuǎn)方的老板的引用,以此來(lái)讓市場(chǎng)中的其他實(shí)現(xiàn)了IWorkerEvents的客戶得到他的工作報(bào)告。
174 //他的老板還是抱怨得很厲害。“丁丁!”他老板吼道,“你為什么在工作一開(kāi)始和工作進(jìn)行中都來(lái)煩我?!
175 //我不關(guān)心這些事件。你不但強(qiáng)迫我實(shí)現(xiàn)了這些方法,而且還在浪費(fèi)我寶貴的工作時(shí)間來(lái)處理你的事件,
176 //特別是當(dāng)我外出的時(shí)候更是如此!你能不能不再來(lái)煩我?”
177 //于是,丁丁意識(shí)到接口雖然在很多情況都很有用,但是當(dāng)用作事件時(shí),“效果”不夠好。
178 //他希望能夠僅在別人想要時(shí)才通知他們,于是他決定把接口的方法分離為單獨(dú)的委托,
179 //每個(gè)委托都像一個(gè)小的接口方法:
180
181 #region 委托類型的定義
182 public delegate void WorkStarted();
183 public delegate void WorkProgressing();
184 public delegate int WorkCompleted();
185 #endregion
186
187 #region Boss3類
188 class Boss3
189 {
190 public int WorkCompleted()
191 {
192 Console.WriteLine("老板評(píng)價(jià):很好!給 7 分");
193 return 7;
194 }
195 }
196 #endregion
197
198 #region Worker3類
199 class Worker3
200 {
201 public WorkStarted started;
202 public WorkProgressing progressing;
203 public WorkCompleted completed;
204
205 public void DoWork()
206 {
207 Console.WriteLine("丁丁:工作開(kāi)始");
208 if (started != null)
209 started();
210 Console.WriteLine("丁丁:工作進(jìn)行中");
211 if (progressing != null)
212 progressing();
213 Console.WriteLine("丁丁:工作完成!自我打分: 5 分");
214 if (completed != null)
215 {
216 int grade = completed();
217 Console.WriteLine("丁丁的工作得分=" + grade);
218 }
219 }
220 }
221 #endregion
222
223 private static void ED3_委托()
224 {
225 Console.WriteLine("ED3_委托---------------------------------------");
226 Worker3 dingding = new Worker3();
227 Boss3 boss = new Boss3();
228 dingding.completed = new WorkCompleted(boss.WorkCompleted);
229 dingding.DoWork();
230 Console.WriteLine("公司消息:產(chǎn)品促銷工作順利結(jié)束!");
231 Console.ReadLine();
232 }
233
234 #endregion
235
236 #region 靜態(tài)監(jiān)聽(tīng)者
237
238 //這樣,丁丁不會(huì)再拿他老板不想要的事件來(lái)煩他老板了,但是他還沒(méi)有把市場(chǎng)放到他的監(jiān)聽(tīng)者列表中。
239 //因?yàn)槭袌?chǎng)是個(gè)包涵一切的實(shí)體,看來(lái)不適合使用實(shí)例方法的委托(想像一下,實(shí)例化一個(gè)市場(chǎng)中的所有客戶要花費(fèi)多少資源!)
240 //于是丁丁就需要能夠?qū)o態(tài)委托進(jìn)行掛鉤,委托對(duì)這一點(diǎn)支持得很好
241
242 static void WorkerStartedWork1()
243 {
244 Console.WriteLine("市場(chǎng)知道M公司已經(jīng)開(kāi)始產(chǎn)品促銷了!");
245 }
246
247 static int WorkerCompletedWork1()
248 {
249 Console.WriteLine("市場(chǎng)很滿意M公司的產(chǎn)品促銷活動(dòng)!給 5 分");
250 return 5;
251 }
252
253 private static void ED4_靜態(tài)監(jiān)聽(tīng)者()
254 {
255 Console.WriteLine("ED4_靜態(tài)監(jiān)聽(tīng)者---------------------------------------");
256 Worker3 dingding = new Worker3();
257 Boss3 boss = new Boss3();
258 dingding.completed += new WorkCompleted(boss.WorkCompleted);
259 dingding.started += new WorkStarted(Market.WorkerStartedWork1);
260 dingding.completed += new WorkCompleted(Market.WorkerCompletedWork1);
261 dingding.DoWork();
262 Console.WriteLine("公司消息:產(chǎn)品促銷工作順利結(jié)束!");
263 Console.ReadLine();
264 }
265
266 #endregion
267
268 #region 事件
269
270 //不幸的是,市場(chǎng)太繁忙了,也不習(xí)慣時(shí)刻關(guān)注它里面的個(gè)體,它可以用自己的委托替換了丁丁老板的委托。
271 //這是把丁丁的Worker類的的委托字段做成public的一個(gè)無(wú)意識(shí)的副作用。
272 //同樣,如果丁丁的老板不耐煩了,也可以決定自己來(lái)激發(fā)丁丁的委托(真是一個(gè)粗魯?shù)睦习?#xff09;:
273 //丁丁的老板可以使用下面的方法來(lái)親手強(qiáng)制其完成工作
274 //if(dingding.completed != null) dingding.completed();
275
276 //丁丁不想讓這些事發(fā)生,他意識(shí)到需要給每個(gè)委托提供“注冊(cè)”和“反注冊(cè)”的功能,
277 //這樣監(jiān)聽(tīng)者就可以自己添加和移除委托,但同時(shí)又不能清空整個(gè)列表也不能隨意激發(fā)丁丁的事件了。
278 //丁丁并沒(méi)有來(lái)自己實(shí)現(xiàn)這些功能,相反,他使用了event關(guān)鍵字讓C#編譯器為他構(gòu)建這些方法:
279
280 //丁丁知道event關(guān)鍵字在委托的外邊包裝了一個(gè)Property,僅讓客戶通過(guò)+=和-=操作符來(lái)添加和移除,
281 //強(qiáng)迫他的老板和市場(chǎng)正確地使用事件。
282
283 #region Worker4類
284 class Worker4
285 {
286 public event WorkStarted started;
287 public event WorkProgressing progressing;
288 public event WorkCompleted completed;
289
290 public void DoWork()
291 {
292 Console.WriteLine("丁丁:工作開(kāi)始");
293 if (started != null) started();
294 Console.WriteLine("丁丁:工作進(jìn)行中");
295 if (progressing != null) progressing();
296 Console.WriteLine("丁丁:工作完成!自我打分: 6 分");
297 if (completed != null)
298 {
299 int grade = completed();
300 Console.WriteLine("丁丁的工作得分=" + grade);
301 }
302 }
303 }
304 #endregion
305
306 private static void ED5_事件()
307 {
308 Console.WriteLine("ED5_事件---------------------------------------");
309 Worker4 dingding = new Worker4();
310 Boss3 boss = new Boss3();
311 dingding.completed += new WorkCompleted(boss.WorkCompleted);
312 dingding.started += new WorkStarted(Market.WorkerStartedWork1);
313 dingding.completed += new WorkCompleted(Market.WorkerCompletedWork1);
314 dingding.DoWork();
315 Console.WriteLine("公司消息:產(chǎn)品促銷工作順利結(jié)束!");
316 Console.ReadLine();
317 }
318
319 #endregion
320
321 #region "收獲"所有結(jié)果
322
323 //到這時(shí),丁丁終于可以送一口氣了,他成功地滿足了所有監(jiān)聽(tīng)者的需求,同時(shí)避免了與特定實(shí)現(xiàn)的緊耦合。
324 //但是他注意到他的老板和市場(chǎng)都為它的工作打了分,但是他僅僅接收了一個(gè)分?jǐn)?shù)。
325 //面對(duì)多個(gè)監(jiān)聽(tīng)者,他想要"收獲"所有的結(jié)果,于是他深入到代理里面,輪詢監(jiān)聽(tīng)者列表,手工一個(gè)個(gè)調(diào)用:
326
327 #region Worker5類
328 class Worker5
329 {
330 public event WorkStarted started;
331 public event WorkProgressing progressing;
332 public event WorkCompleted completed;
333
334 public void DoWork()
335 {
336 Console.WriteLine("丁丁:工作開(kāi)始");
337 if (started != null) started();
338 Console.WriteLine("丁丁:工作進(jìn)行中");
339 if (progressing != null) progressing();
340 Console.WriteLine("丁丁:工作完成!自我打分: 7 分");
341 if (completed != null)
342 {
343 //遍歷代理中的所有委托對(duì)象,依次獲取結(jié)果
344 foreach (WorkCompleted wc in completed.GetInvocationList())
345 {
346 int grade = wc();
347 Console.WriteLine("丁丁的工作得分=" + grade);
348 }
349 }
350 }
351 }
352 #endregion
353
354 private static void ED6_收獲所有結(jié)果()
355 {
356 Console.WriteLine("ED6_收獲所有結(jié)果---------------------------------------");
357 Worker5 dingding = new Worker5();
358 Boss3 boss = new Boss3();
359 dingding.completed += new WorkCompleted(boss.WorkCompleted);
360 dingding.started += new WorkStarted(Market.WorkerStartedWork1);
361 dingding.completed += new WorkCompleted(Market.WorkerCompletedWork1);
362 dingding.DoWork();
363 Console.WriteLine("公司消息:產(chǎn)品促銷工作順利結(jié)束!");
364 Console.ReadLine();
365 }
366
367 #endregion
368
369 #region 異步通知:激發(fā)
370
371 //同時(shí),他的老板和市場(chǎng)還要忙于處理其他事情,也就是說(shuō)他們給丁丁打分所花費(fèi)的事件變得非常長(zhǎng):
372 //很不幸,丁丁每次通知一個(gè)監(jiān)聽(tīng)者后必須等待它給自己打分,現(xiàn)在這些通知花費(fèi)了他太多的工作時(shí)間。
373 //于是他決定忘掉分?jǐn)?shù),僅僅異步激發(fā)事件:
374
375 #region Boss4類
376 class Boss4
377 {
378 public int WorkCompleted()
379 {
380 System.Threading.Thread.Sleep(3000);
381 Console.WriteLine("老板評(píng)價(jià):非常好!給 10 分");
382 return 10;
383 }
384 }
385 #endregion
386
387 #region Worker6類
388 class Worker6
389 {
390 public event WorkStarted started;
391 public event WorkProgressing progressing;
392 public event WorkCompleted completed;
393
394 public void DoWork()
395 {
396 Console.WriteLine("丁丁:工作開(kāi)始");
397 if (started != null) started();
398 Console.WriteLine("丁丁:工作進(jìn)行中");
399 if (progressing != null) progressing();
400 Console.WriteLine("丁丁:工作完成!自我打分: 8 分");
401 if (completed != null)
402 {
403 foreach (WorkCompleted wc in completed.GetInvocationList())
404 {
405 wc.BeginInvoke(null, null);
406 }
407 }
408 }
409 }
410 #endregion
411
412 static void WorkerStartedWork2()
413 {
414 Console.WriteLine("市場(chǎng)知道M公司已經(jīng)開(kāi)始產(chǎn)品促銷了!");
415 }
416
417 static int WorkerCompletedWork2()
418 {
419 //暫停進(jìn)程一段時(shí)間以模擬繁忙程度
420 System.Threading.Thread.Sleep(4000);
421 Console.WriteLine("市場(chǎng)很滿意M公司的產(chǎn)品促銷活動(dòng)!給 10 分");
422 return 10;
423 }
424
425 private static void ED7_異步通知_激發(fā)()
426 {
427 Console.WriteLine("ED7_異步通知_激發(fā)---------------------------------------");
428 Worker6 dingding = new Worker6();
429 Boss4 boss = new Boss4();
430 dingding.completed += new WorkCompleted(boss.WorkCompleted);
431 dingding.started += new WorkStarted(Market.WorkerStartedWork2);
432 dingding.completed += new WorkCompleted(Market.WorkerCompletedWork2);
433 dingding.DoWork();
434 Console.WriteLine("公司消息:產(chǎn)品促銷工作順利結(jié)束!");
435 Console.ReadLine();
436 }
437
438 #endregion
439
440 #region 異步通知:輪詢
441
442 //這使得丁丁可以通知他的監(jiān)聽(tīng)者,然后立即返回工作,讓進(jìn)程的線程池來(lái)調(diào)用這些代理。隨著時(shí)間的過(guò)去,
443 //丁丁發(fā)現(xiàn)他丟失了他工作的反饋,他知道聽(tīng)取別人的贊揚(yáng)和努力工作一樣重要,于是他不但異步激發(fā)事件,
444 //還要周期性地輪詢,取得可用的分?jǐn)?shù)。
445
446 #region Worker7類
447 class Worker7
448 {
449 public event WorkStarted started;
450 public event WorkProgressing progressing;
451 public event WorkCompleted completed;
452
453 public void DoWork()
454 {
455 Console.WriteLine("丁丁:工作開(kāi)始");
456 if (started != null) started();
457 Console.WriteLine("丁丁:工作進(jìn)行中");
458 if (progressing != null) progressing();
459 Console.WriteLine("丁丁:工作完成!自我打分: 9 分");
460 if (completed != null)
461 {
462 foreach (WorkCompleted wc in completed.GetInvocationList())
463 {
464 IAsyncResult res = wc.BeginInvoke(null, null);
465 while (!res.IsCompleted)
466 System.Threading.Thread.Sleep(1);
467 int grade = wc.EndInvoke(res);
468 Console.WriteLine("丁丁的工作得分=" + grade);
469 }
470 }
471 }
472 }
473 #endregion
474
475 private static void ED8_異步通知_輪詢()
476 {
477 Console.WriteLine("ED8_異步通知_輪詢---------------------------------------");
478 Worker7 dingding = new Worker7();
479 Boss4 boss = new Boss4();
480 dingding.completed += new WorkCompleted(boss.WorkCompleted);
481 dingding.started += new WorkStarted(Market.WorkerStartedWork2);
482 dingding.completed += new WorkCompleted(Market.WorkerCompletedWork2);
483 dingding.DoWork();
484 Console.WriteLine("公司消息:產(chǎn)品促銷工作順利結(jié)束!");
485 Console.ReadLine();
486 }
487
488 #endregion
489
490 #region 異步通知:回調(diào)
491
492 //不幸地,丁丁有回到了一開(kāi)始就想避免的情況中來(lái),比如,老板站在背后盯著他工作。
493 //于是,他決定使用自己的委托回調(diào)函數(shù)作為他調(diào)用的異步委托完成的通知,讓他自己立即回到工作,
494 //但是仍可以在別人給他的工作打分后得到通知:
495
496 #region Worker8類
497 class Worker8
498 {
499 public event WorkStarted started;
500 public event WorkProgressing progressing;
501 public event WorkCompleted completed;
502
503 public void DoWork()
504 {
505 Console.WriteLine("丁丁:工作開(kāi)始");
506 if (started != null) started();
507 Console.WriteLine("丁丁:工作進(jìn)行中");
508 if (progressing != null) progressing();
509 Console.WriteLine("丁丁:工作完成!自我打分: 10 分");
510 if (completed != null)
511 {
512 foreach (WorkCompleted wc in completed.GetInvocationList())
513 {
514 wc.BeginInvoke(new AsyncCallback(WorkGraded), wc);
515 }
516 }
517 }
518
519 private void WorkGraded(IAsyncResult res)
520 {
521 WorkCompleted wc = (WorkCompleted)res.AsyncState;
522 int grade = wc.EndInvoke(res);
523 Console.WriteLine("丁丁的工作得分=" + grade);
524 }
525 }
526 #endregion
527
528 private static void ED9_異步通知_回調(diào)()
529 {
530 Console.WriteLine("ED9_異步通知_回調(diào)---------------------------------------");
531 Worker8 dingding = new Worker8();
532 Boss4 boss = new Boss4();
533 dingding.completed += new WorkCompleted(boss.WorkCompleted);
534 dingding.started += new WorkStarted(Market.WorkerStartedWork2);
535 dingding.completed += new WorkCompleted(Market.WorkerCompletedWork2);
536 dingding.DoWork();
537 Console.WriteLine("公司消息:產(chǎn)品促銷工作順利結(jié)束!");
538 Console.ReadLine();
539 }
540
541 #endregion
542
543 #region 尾聲
544
545 //整個(gè)軟件市場(chǎng)的繁榮
546 //丁丁、他的老板和市場(chǎng)最終都滿足了。丁丁的老板和市場(chǎng)可以收到他們感興趣的事件通知,
547 //減少了實(shí)現(xiàn)的負(fù)擔(dān)和非必需的往返“差旅費(fèi)”。丁丁可以通知他們,而不管他們要花多長(zhǎng)時(shí)間來(lái)從目的方法中返回,
548 //同時(shí)又可以異步地得到他的結(jié)果。丁丁知道,這并不簡(jiǎn)單,因?yàn)楫?dāng)他異步激發(fā)事件時(shí),
549 //方法要在另外一個(gè)線程中執(zhí)行,丁丁的目的方法完成的通知也是一樣的道理。
550 //于是丁丁便開(kāi)始著手研究線程了……<本章完>
551
552 #endregion
553
554 }
?
轉(zhuǎn)載于:https://www.cnblogs.com/liming1019/archive/2010/07/26/1785636.html
總結(jié)
以上是生活随笔為你收集整理的《丁丁历险记系列之委托》-- 摘自http://www.cnblogs.com/xfxxx/archive/2010/04/03/1703839.html...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 互联网的三大巨头 百度 阿里巴巴 腾讯(
- 下一篇: 中国智慧停车行业未来前景展望及项目运营规