C#事件機制歸納(上)
2024-07-21 02:19:34
供稿:網友
1.委派的實現過程。
首先來看一下委派,委派其實就是方法的傳遞,并不定義方法的實現。事件其實就是標準化了的委派,為了事件處理過程特制的、稍微專業化一點的組播委派(多點委派)。下面舉一個例子,我覺得把委派的例子和事件的例子比較,會比較容易理解。
using system;
class class1
{
delegate int mathop(int i1,int i2);
static void main(string[] args)
{
mathop op1=new mathop(add);
mathop op2=new mathop(multiply);
console.writeline(op1(100,200));
console.writeline(op2(100,200));
console.readline();
}
public static int add(int i1,int i2)
{
return i1+i2;
}
public static int multiply(int i1,int i2)
{
return i1*i2;
}
}
首先代碼定義了一個委托mathop,其簽名匹配與兩個函數add()和multiply()的簽名(也就是其帶的參數類型數量相同):
delegate int mathop(int i1,int i2);
main()中代碼首先使用新的委托類型聲明一個變量,并且初始化委托變量.注意,聲明時的參數只要使用委托傳遞的函數的函數名,而不加括號:
mathop op1=new mathop(add);
(或為mathop op1=new mathop(multiply);)
委托傳遞的函數的函數體:
public static int add(int i1,int i2)
{
return i1+i2;
}
public static int multiply(int i1,int i2)
{
return i1*i2;
}
然后把委托變量看作是一個函數名,將參數傳遞給函數。 console.writeline(op1(100,200));
console.writeline(op2(100,200));
2.事件的實現過程
using system;
class class1
{
static void main(string[] args)
{
student s1=new student();
student s2=new student();
s1.registerok +=new student.delegateregisterokevent(student_registerok);
s2.registerok +=new student.delegateregisterokevent(student_registerok);
s1.register();
s2.register();
console.readline();
}
static void student_registerok()
{
console.writeline("hello");
}
}
class student
{
public delegate void delegateregisterokevent();
public event delegateregisterokevent registerok;
public string name;
public void register()
{
console.writeline("register method");
registerok();
}
}
在student類中,先聲明了委托delegateregisterokevent(),然后使用event和要使用的委托類型(前面定義的delegateregisterokevent委托類型)聲明事件registerok(可以看作是委托的一個實例。):
public delegate void delegateregisterokevent();
public event delegateregisterokevent registerok;
然后在main()函數中,實例化student類,然后s1.registerok事件委托給了student_registerok 方法。通過“+=”(加等于)操作符非常容易地為.net對象中的一個事件添加一個甚至多個響應方法;還可以通過非常簡單的“-=”(減等于)操作符取消這些響應方法。
然后,當調用s1.register()時,事件s1.registerok發生。