案例:定一個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則不是學習重點。掌握“事件和語法”、“委託和事件的關係和區別(面試題)”即可。
事件、索引器、屬性本質上都是方法。(面試題)接口中可以定義什麼?
答:接口中只可以定義方法。接口中也可以定義“事件、索引器、屬性”,因為他們本質上也都是方法。
閱讀更多 低頭搬磚的小強 的文章