C#委托的最簡單入門和理解


 
  委托是.net語言中非常重要的一個概念,初學不太好理解也沒有關系的,在一次一次的攻關后會領會到委托的精妙,可以說 .net 沒有委托就沒有后面更高級的事件,異步多線程等等特性的形成可能。所以一定要認真的對待.net語言中的這一重要概念。
  委托實例就是方法的指針,它指向一個或一組方法,調用一個委托的Invoke()方法就會把它指向的那個方法都執行一遍
  初學時要注意對委托和委托實例的理解,委托是約束它所指向方法的返回值和參數,相當於我們在操作變量時對變量的聲明;委托實例則相當於是帶有具體約束的委托的變量,它實例化了一個委托,這種實例化相當於我們實例化一個類時用new class1();這種方式所做的工作。
  可以先把泛型的概念放到一邊,否則我們要啃的山頭就更大了,並且泛型是.net后期才出現的,而委托這一概念在沒有泛型的早期也就早已經使用的很普遍了。 
 1     public class 計算器類
 2     {
 3         //聲明一個具體的委托類型mydelegate,它規定綁定到它這種類型的變量的方法的返回值是一個decimal類型
 4         //同時它也規定綁定到它這種類型的變量的方法的返回值是兩個decimal類型
 5         public delegate decimal mydelegate(decimal m, decimal n);
 6         //接下來有兩個方法符合上面的返回值和入參的規范:
 7         static decimal Operation1(decimal x, decimal y)
 8         { return x + y; }
 9         static decimal Operation2(decimal x, decimal y)
10         { return x * y; }
11         public mydelegate 算法;
12         void XX()
13         {
14             //接下來是實例化一個委托,也就是把方法綁定到具體委托類型(mydelegate)的變量(算法)
15             算法 = new mydelegate(Operation1);
16             //使用+=操作符把多個方法綁定給一個委托類型(mydelegate)的變量
17             算法 += new mydelegate(Operation2);
18         }
19         public decimal ExecuteOperation(decimal a, decimal b)
20         {
21             return 算法.Invoke(a, b);
22         }
23     }
24     //2.委托對面向對象多態的體現:在下面 客戶端運算類中 我們只需要傳給計算器類的委托實例【算法】一個具體的算法(相減),
25     //則計算器類就能在不改動的情況下擁有新的算法能力
26     public class 客戶端運算
27     {
28         計算器類 jsq1 = new 計算器類();
29         //在計算器類中並沒有的新的算法:相減
30         public decimal 相減(decimal x, decimal y)
31         { return x - y; }
32         void 指示計算器做減法()
33         {
34             //把方法綁定給委托實例
35             jsq1.算法 += 相減;
36             Console.WriteLine(jsq1.算法.Invoke(5, 6));
37         }
38 
39 
40         //我們還可以這樣做,調用外部封裝好的算法方法,然后把這個方法成員綁定給委托實例,比如
41         void 指示計算器做除法()
42         {
43             //把單獨類中的方法成員綁定給委托實例
44             jsq1.算法 += new 除法算法類().相除;
45             Console.WriteLine(jsq1.算法.Invoke(20, 5));
46         }
47     }
48     //把除法封裝在一個單獨的類中的方法成員:相除
49     public class 除法算法類
50     {
51         public decimal 相除(decimal x, decimal y)
52         { return x / y; }
53     }

 如有理解錯誤的地方,歡迎大家拍磚指正。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM