C#高級技術之事件詳解

案例:定一個Person類,定一個監聽年齡變化的事件,當本命年的時候祝賀一下。觸發事件的地方要判斷一下是不是事件null

事件語法:event Mydelegate mdl;

加了event關鍵字實現事件機制的好處:用了event事件,不可以修改事件已經註冊的值;不可以冒充進行事件通知了。只能+=、-=!

using System;

using System.Collections;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace TestConsole

{

delegate void MyDel();

class Program

{

static void Main(string[] args)

{

person p = new person();

p.QingZhu += ShowMsg;

p.age = 24;

Console.ReadKey();

}

static void ShowMsg()

{

Console.WriteLine("今年是你的本命年!恭喜你");

}

}

class person

{

private int Age;

public int age

{

get

{

return age;

}

set

{

if (value % 12 == 0)

{

if (QingZhu != null)

{

QingZhu();//執行事件

}

}

}

}

public event MyDel QingZhu;

}

}

委託和事件的總結

委託的作用:佔位,在不知道將來要執行的方法的具體代碼時,可以先用一個委託變量來代替方法調用(委託的返回值,參數列表要確定)。在實際調用之前,需要為委託賦值,否則為null。

事件的作用: 事件的作用與委託變量一樣,只是功能上比委託變量有更多的限制。(比如:1.只能通過+=或-=來綁定方法(事件處理程序)2.只能在類內部調用(觸發)事件。)

(面試題)事件和委託的關係:事件由一個私有的委託變量和add_***和remove_***方法組成;

事件的非簡化寫法:聲明一個私有的委託變量和add、remove方法。

using System;

using System.Collections;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace TestConsole

{

delegate void MyDel();

class Program

{

static void Main(string[] args)

{

person p = new person();

p.qingzhu += ShowMsg;

p.age = 24;

Console.ReadKey();

}

static void ShowMsg()

{

Console.WriteLine("今年是你的本命年!恭喜你");

}

}

class person

{

private int Age;

public int age

{

get

{

return age;

}

set

{

if (value % 12 == 0)

{

if (this.QingZhu != null)

{

this.QingZhu();//執行事件

}

}

}

}

private MyDel QingZhu;

public event MyDel qingzhu

{

add

{

this.QingZhu += value;

}

remove

{

this.QingZhu -= value;

}

}

}

}

委託和事件的區別和關係

一種錯誤的說法“事件是一種特殊的委託”,事件時候是有一個私有委託和add、remove兩個方法組成的。

委託用的比較多,事件只有開發WinForm、WPF的時候用的才比較多,而WinForm、WPF則不是學習重點。掌握“事件和語法”、“委託和事件的關係和區別(面試題)”即可。

事件、索引器、屬性本質上都是方法。(面試題)接口中可以定義什麼?

答:接口中只可以定義方法。接口中也可以定義“事件、索引器、屬性”,因為他們本質上也都是方法。


分享到:


相關文章: