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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

[读书笔记]C#学习笔记二: 委托和事件的用法及不同.

發(fā)布時間:2025/3/17 C# 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [读书笔记]C#学习笔记二: 委托和事件的用法及不同. 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.


前言:?

C#委托是什么 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

c#中的委托可以理解為函數(shù)的一個包裝, 它使得C#中的函數(shù)可以作為參數(shù)來被傳遞, 這在作用上相當于C++中的函數(shù)指針. C++用函數(shù)指針獲取函數(shù)的入口地址, 然后通過這個指針來實現(xiàn)對函數(shù)的操作.

委托的定義和方法的定義類似, 只是在定義的前面多了一個delegate關鍵字.

?

正文:


委托可以被視為一個更高級的指針,它不僅僅能把地址傳指向另一個函數(shù),而且還能傳遞參數(shù),返回值等多個信息。
系統(tǒng)還為委托對象自動生成了同步,異步的調(diào)用方式,開發(fā)人員使用BeginInvoke,EndInvoke方法就可以拋開Thread而直接使用多線程調(diào)用。

?

一, 委托
用IL 分析可看出Delegate繼承自System.MulticastDelegate類,并自動生成BeginInvoke,EndInvoke,Invoke三種常見的方法。

Invoke方法是用于同步調(diào)用委托對象的對應方法,而BeginInvoke,EndInvoke是用于以異步方式調(diào)用對應方法的。

1.1 簡單的委托
當建立委托對象時,委托的參數(shù)類型必須與委托方法相對應。只要向建立委托對象的構造函數(shù)中輸入方法名稱example.Method,委托就會直

接綁定此方法。
使用myDelegate.Invoke(string message),就能顯式調(diào)用委托方法。
但在實際的操作中,我們無須用到 Invoke 方法,而只要直接使用myDelegate(string message),就能調(diào)用委托方法。

1 class Program 2 { 3 void MyDelegate(string message); 4 5 public class Example 6 { 7 public void Method(string message) 8 { 9 MessageBox.Show(message); 10 } 11 } 12 13 static void Main(string[] args) 14 { 15 Example example=new Example(); 16 MyDelegate myDelegate=new MyDelegate(example.Method); 17 myDelegate("Hello World"); 18 Console.ReadKey(); 19 } 20 }

?

1.2 帶返回值的委托

當建立委托對象時,委托的返回值必須與委托方法相對應。使用下面的例子,方法將返回 “Hello Leslie” 。

1 class Program 2 { 3 delegate string MyDelegate(string message); 4 5 public class Example 6 { 7 public string Method(string name) 8 { 9 return "Hello " + name; 10 } 11 } 12 13 static void Main(string[] args) 14 { 15 Example example=new Example(); 16 //綁定委托方法 17 MyDelegate myDelegate=new MyDelegate(example.Method); 18 //調(diào)用委托,獲取返回值 19 string message = myDelegate("Leslie"); 20 Console.WriteLine(message); 21 Console.ReadKey(); 22 } 23 }

?

1.3 多路廣播委托
在上面提過,委托類繼承于MulticastDelegate,這使委托對象支持多路廣播,即委托對象可以綁定多個方法。
當輸入?yún)?shù)后,每個方法會按順序進行迭代處理,并返回最后一個方法的計算結(jié)果。
下面的例子中,Price 類中有兩個計算方法,Ordinary 按普通的9.5折計算,Favourable 按優(yōu)惠價 8.5 折計算。
委托同時綁定了這兩個方法,在輸入?yún)?shù)100以后,Ordinary、Favourable這兩個方法將按順序迭代執(zhí)行下去,最后返回 Favourable 方法的

計算結(jié)果 85。

1 delegate double MyDelegate(double message); 2 public class Price 3 { 4 public double Ordinary(double price) 5 { 6 double price1 = 0.95 * price; 7 Console.WriteLine("Ordinary Price : "+price1); 8 return price1; 9 } 10 11 public double Favourable(double price) 12 { 13 double price1 = 0.85 * price; 14 Console.WriteLine("Favourable Price : " + price1); 15 return price1; 16 } 17 18 static void Main(string[] args) 19 { 20 Price price = new Price(); 21 //綁定Ordinary方法 22 MyDelegate myDelegate = new MyDelegate(price.Ordinary); 23 //綁定Favourable方法 24 myDelegate += new MyDelegate(price.Favourable); 25 //調(diào)用委托 26 Console.WriteLine("Current Price : " + myDelegate(100)); 27 Console.ReadKey(); 28 } 29 }

?

1.4 Observer模式中的事件與委托?

1 class Program 2 { 3 public delegate void ObserverDelegate(); 4 5 static void Main(string[] args) 6 { 7 // 具體主題角色通常用具體自來來實現(xiàn) 8 ConcreteSubject subject = new ConcreteSubject(); 9 10 //傳入的只是觀察者的通過方法。 11 subject.Attach(new ConcreteObserver(subject, "Observer A").Update); 12 subject.Attach(new ConcreteObserver(subject, "Observer B").Update); 13 subject.Attach(new ConcreteObserver(subject, "Observer C").Update); 14 15 subject.SubjectState = "Ready"; 16 subject.Notify(); 17 18 Console.Read(); 19 } 20 21 22 //抽象主體類 23 public abstract class Subject 24 { 25 public ObserverDelegate observerDelegate; 26 27 //增加觀察者 28 public void Attach(ObserverDelegate observer) 29 { 30 observerDelegate += observer; 31 } 32 33 //移除觀察者 34 public void Remove(ObserverDelegate observer) 35 { 36 observerDelegate -= observer; 37 } 38 39 //像觀察者發(fā)通知 40 public void Notify() 41 { 42 if (observerDelegate != null) 43 { 44 observerDelegate(); 45 } 46 } 47 } 48 49 //具體主題類 50 public class ConcreteSubject : Subject 51 { 52 public string SubjectState { get; set; } 53 } 54 55 //具體觀察者 56 public class ConcreteObserver 57 { 58 private string observerState; 59 private string name; 60 private ConcreteSubject subject; 61 62 public ConcreteObserver(ConcreteSubject subject, string name) 63 { 64 this.subject = subject; 65 this.name = name; 66 } 67 68 //實現(xiàn)抽象觀察者中的更新操作 69 public void Update() 70 { 71 observerState = subject.SubjectState; 72 Console.WriteLine("The observer's state of {0} is {1}", name, observerState); 73 } 74 } 75 }

?

二,事件 event


(1) 事件時委托的封裝,可以理解為一種特殊的委托。
(2) 事件里面其實就兩個方法(即add_event() 和 remove_event())和一個私有的委托變量,這兩個方法里面分別是對這個私有的委托變量進

行的合并和移除,當調(diào)用事件的+=時其實是調(diào)用的事件里的add_event()方法,同樣-=調(diào)用的是remove_event()方法
(3) 事件只能夠從對象外部增加新的響應方法和刪除已知的響應方法,而不能主動去觸發(fā)事件和獲取其他注冊的響應方法等信息。如果使用

公有的delegate則不能做這些限制,也就是說事件對委托做了限制,使委托使用起來更加方便。
也有人說事件是對委托的閹割,大概也是這個意思。

這里事件沒有做過多的闡述, 看到一個關于事件講解的比較不錯的博文, 推薦大家看下吧:?http://www.cnblogs.com/landeanfen/p/4721525.html

PS: 本博客只是為了記錄自己學習中的收獲, 俗話說 好記性不如爛筆頭. 望自己能夠堅持下去.?

總結(jié)

以上是生活随笔為你收集整理的[读书笔记]C#学习笔记二: 委托和事件的用法及不同.的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。