委托與事件


學習了.NET這么久,卻一直對委托和事件兩個概念一知半解,今天就仔細研究了下,寫出來與大家分享:

 

委托和事件的概念性的東東:

1、委托是對函數的封裝,可以看作是給方法特征的一個名稱,

2、委托是一種引用方法類型(委托是引用類型,創建實例時用new),一旦為委托分配了方法,委托就與該方法具有完全相同的行為,

3、事件是委托類型的對象,類或對象可以通過事件通知其他類或對象發生相關的事情 

4、事件的實現是基於委托的,

 

下面通過代碼來感受下

    //創建貓類
class Cat
{
string name;
public Cat(string name)
{
this.name = name;
}
//聲明委托
public delegate void CatShoutDelegate();
//聲明委托類型為CatShoutDelegate的事件OnCatShout
public event CatShoutDelegate OnCatShout;//事件分為 訂閱者、發起者、處理
//創建方法
public void Shout()
{
Console.WriteLine("喵,我是"+name);
if(OnCatShout!=null)
{
OnCatShout();//表示當Shout方法發生時,如果事件有訂閱者 就執行OnCatShout
}
}
}
//創建老鼠類
class Mouse
{
string name;
public Mouse(string name)
{
this.name = name;
}
public void Run()
{
Console.WriteLine("貓來了,{0}快逃命吧", name);
}
}

class Program
{
static void Main(string[] args)
{
Cat cat = new Cat("Tom");
Mouse m1 = new Mouse("Miqi");
Mouse m2 = new Mouse("Jerry");
//事件訂閱者並附帶處理Run方法
cat.OnCatShout+=new Cat.CatShoutDelegate(m1.Run);
cat.OnCatShout+=new Cat.CatShoutDelegate(m2.Run);
//事件發起者
cat.Shout();
Console.ReadKey();
}
}

在Main方法中我們只調用了Cat類中的Shout方法;

Shout方法是事件的發起者 通過+=運算符來訂閱事件, Run方法是事件發生時的處理方法。

 

后面再講下委托和事件的別(面試經常問到)
1、其實他們不懼可比性,因為委托是引用類型,而事件是委托類型的對象

2、事件的實現是基於委托的,通過用反編譯器我們可以看到當我們定義的事件實質上是由兩個方法add和remove實現的  通過下面的代碼我們可以看到事件有點像委托類型的屬性。事件有一個好處就是我們只能增加和減少訂閱者 而不能直接給事件賦值 例如賦值為null 是很危險的 因為如果我們很多訂閱者都在監聽同一個事件 當設置為null的時候 其他人就不能監聽到事件啦。

View Code
public event CatShoutDelegate OnCatShout
{
add
{
CatShoutDelegate delegate3;
CatShoutDelegate onCatShout = this.OnCatShout;
do
{
delegate3 = onCatShout;
CatShoutDelegate delegate4 = (CatShoutDelegate) Delegate.Combine(delegate3, value);
onCatShout = Interlocked.CompareExchange<CatShoutDelegate>(ref this.OnCatShout, delegate4, delegate3);
}
while (onCatShout != delegate3);
}
remove
{
CatShoutDelegate delegate3;
CatShoutDelegate onCatShout = this.OnCatShout;
do
{
delegate3 = onCatShout;
CatShoutDelegate delegate4 = (CatShoutDelegate) Delegate.Remove(delegate3, value);
onCatShout = Interlocked.CompareExchange<CatShoutDelegate>(ref this.OnCatShout, delegate4, delegate3);
}
while (onCatShout != delegate3);
}
}

以上只是個人很淺顯的總結  希望大家 繼續跟進 積極評論!!!


免責聲明!

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



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