委托是.net語言中非常重要的一個概念,初學不太好理解也沒有關系的,在一次一次的攻關后會領會到委托的精妙,可以說 .net 沒有委托就沒有后面更高級的事件,異步多線程等等特性的形成可能。所以一定要認真的對待.net語言中的這一重要概念。
委托實例就是方法的指針,它指向一個或一組方法,調用一個委托的Invoke()方法就會把它指向的那個方法都執行一遍
初學時要注意對委托和委托實例的理解,委托是約束它所指向方法的返回值和參數,相當於我們在操作變量時對變量的聲明;委托實例則相當於是帶有具體約束的委托的變量,它實例化了一個委托,這種實例化相當於我們實例化一個類時用new class1();這種方式所做的工作。
可以先把泛型的概念放到一邊,否則我們要啃的山頭就更大了,並且泛型是.net后期才出現的,而委托這一概念在沒有泛型的早期也就早已經使用的很普遍了。
初學時要注意對委托和委托實例的理解,委托是約束它所指向方法的返回值和參數,相當於我們在操作變量時對變量的聲明;委托實例則相當於是帶有具體約束的委托的變量,它實例化了一個委托,這種實例化相當於我們實例化一個類時用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 }
如有理解錯誤的地方,歡迎大家拍磚指正。
