1 代理的實現過程。
代理其實就是方法的傳遞,並不定義方法的實現。事件其實就是標準化了的代理,為了事件處理過程特製的、稍微專業化一點的組播代理(多點代理)。看下面的例子,把代理的例子和事件的例子比較,容易理解。using System;
class Class1
{
delegate int MathOp(int Num1, int Num2);
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 Num1, int Num2)
{
return Num1 + Num2;
}
public static int Multiply(int Num1, int Num2)
{
return Num1 * Num2;
}
}
首先代碼定義了一個代理MathOp,其簽名匹配與兩個函數Add()和Multiply()的簽名(也就是其帶的參數類型數量相同):
delegate int MathOp(int Num1, int Num2);
Main()中代碼首先使用新的代理型別宣告一個變數,並且初始化代理變數.注意,聲明時的參數只要使用代理傳遞的函數的函數名,而不加括弧:
MathOp op1 = new MathOp(Add);
代理傳遞的函數的函數體:
public static int Add(int Num1, int Num2)
{
return Num1 + Num2;
}
public static int Multiply(int Num1, int Num2)
{
return Num1 * Num2;
}
然後把代理變數看作是一個函數名,將參數傳遞給函數。
Console.WriteLine(op1(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 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發生。
3.C#中預定義事件處理方式
學習事件,我覺得最不好理解的就是C#中預定義了事件,使我才開始學習事件時一頭霧水。在查了些資料後,終於弄明白了一些,如下:
EventArgs是包含事件數目據的類的基類,用於傳遞事件的細節。
EventHandler是一個代理聲明如下(其在.Net類庫中如下聲明的)
public delegate void EventHandler( object sender , EventArgs e ) 所以,所有形如:
void 函婁名(object 參數名,EventArgs 參數名);
的函數都可以作為Control類的Click事件回應程式法了。如下面所定義的一個事件回應程式法:
private void button1_Click(object sender, System.EventArgs e)
參數object sender表示引發事件的對象,(其實這裡傳遞的是對象的引用,如果是button1的click事件則sender就是button1)System.EventArgs e 代表事件的相應資訊,如滑鼠的x,y值等。
下面我們研究一下Button類看看其中的事件聲明,以Click事件為例。
public event EventHandler Click;
這裡定義了一個EventHandler類型的事件Click
private void button1_Click(object sender, System.EventArgs e)
{
...
}
這是我們和button1_click事件所對應的方法。注意方法的參數符合代理中的簽名(既參數列表)。那我們怎麼把這個方法和事件聯絡起來呢,請看下面的代碼。
this.button1.Click += new System.EventHandler(this.button1_Click); (其實button1.Click 為System.EventHandler代理的執行個體事件。與代理中代理執行個體代理給某一方法非常相似)
把this.button1_Click方法綁定到this.button1.Click事件。
4.事件參數的使用。
using System;
class Class1
{
static void Main()
{
Student s1 = new Student();
s1.Name = "Student1";
Student s2 = new Student();
s2.Name = "Student2";
s1.RegisterOK += new Student.DelegateRegisterOkEvent(Student_RegisterOK);
s2.RegisterOK += new Student.DelegateRegisterOkEvent(Student_RegisterOK);
//當Register方法一執行,觸發RegisterOK事件
//RegisterOK事件一觸發,然後執行Student_RegisterOK方法
s1.Register();
s2.Register();
Console.ReadLine();
}
static void Student_RegisterOK(RegisterOkArgs e)
{
Console.WriteLine(e.EventInfo);
}
}
class Student
{
public delegate void DelegateRegisterOkEvent(RegisterOkArgs e);
public event DelegateRegisterOkEvent RegisterOK;
public string Name;
public void Register()
{
Console.WriteLine("Register Method");
RegisterOK(new RegisterOkArgs("Student Name: " + Name));
}
}
class RegisterOkArgs : EventArgs
{
public string EventInfo;
public RegisterOkArgs(string eventInfo): base()
{
this.EventInfo = eventInfo;
}
}
引用:
http://www.cnblogs.com/salonliudong/archive/2007/08/30/876308.html