日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#-委托和事件

發布時間:2023/12/13 C# 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#-委托和事件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

要為類構造一個事件,必須用 event 來聲明一個 delegate 型的字段,如:

puclic calss Test{
???????? public delegate EventHandler(object sender, EventArgs e); //聲明為delegate 型的事件;
}

然后要指定一個事件的名稱,并寫出處理語句:
??????? public event? EventHandler Load

在創建類的實例后定義這個 “Load”事件:
??????? Test m=new Test();
??????? m.load=new EventHandler(m_Load);
??????? void m_Load(object sender, EventArgs e)
??????? {
??????????????? MessageBox.Show(" this is a class event");
??????? }??????


再看看下面的完整的一段代碼:


?using System;
?
?class TestClass
?{
???? static void Main(string[] args)
????? {
???????? EventClass myEventClass = new EventClass();
???????? myEventClass.CustomEvent += new EventClass.CustomEventHandler(CustomEvent1); // 關聯事件句柄;
???????? myEventClass.CustomEvent += new EventClass.CustomEventHandler(CustomEvent2);
??????? myEventClass.InvokeEvent();
??????? myEventClass.CustomEvent -= new EventClass.CustomEventHandler(CustomEvent2);
??????? myEventClass.InvokeEvent();
??????? myEventClass.Load += new EventClass.CustomEventHandler(Load1);
??????? myEventClass.onLoad();
??? }

??? private static void CustomEvent1(object sender, EventArgs e)
??? {
??????? Console.WriteLine("Fire Event 1");
??? }

??? private static void CustomEvent2(object sender, EventArgs e)
??? {
??????? Console.WriteLine("Fire Event 2");
??? }
??? private static void Load1(object sender, EventArgs e)
??? {
??????? Console.WriteLine("Current background color is {0}. Please input:", System.Console.BackgroundColor.ToString());
??? }
}

public class EventClass
{
??? public delegate void CustomEventHandler(object sender, EventArgs e);//首先定義一個委托類型的對象CustomEventHandler

??? //用delegate數據類型聲明事件,要用event關鍵字,這里定義了兩個字件;
??? public event CustomEventHandler CustomEvent;
??? public event CustomEventHandler Load;
???????
??? public void InvokeEvent()
??? {
??????? CustomEvent(this, EventArgs.Empty);
??? }
??? public void onLoad()
??? {
??????? Console.BackgroundColor = ConsoleColor.Red;
??????? Load(this, EventArgs.Empty);
??????? string s = Console.ReadLine();
??????? if (s != "yuping")
??????? {
??????????? Console.WriteLine("You must type 'yuping' for change it !");
??????? }
??????? else
??????? {
??????????? Console.BackgroundColor = System.ConsoleColor.Black;
??????????? Console.Clear();
??????? }

??? }
}

??????? 在包含事件聲明的類中,聲明一個數據類型是委托的這么樣的一個對象CustomEventHandler, 它有兩個參數(sender和e);在這里使用委托的目的就是在運行中向參數傳遞方法,并由委托對象生成的實例接收這個參數方法的返回值,因此,在聲明委托型的對象時應根據類中的方法結構來定義,或者說在引用類中應當根據委托型對象的結構來生成響應事件的方法結構,比如兩者都有哪些類型的參數、返回值的類型,也就是說兩者要保持一致。同時,要正確地使用C#中的委托,就必須保持三個步驟:聲明——實例化——調用。
???????
??????? 在上面的代碼中,EventClass 類就體現了這個原則:
??????? 1. 聲明委托類型的對象: public delegate void CustomEventHandler(object sender, EventArgs e);
??????? 2. 創建CustomEventHandler對象的實例CustomEvent:public event CustomEventHandler CustomEvent;
??????? 3. 在InvokeEvent()方法中實現了對該事件的調用,引用事件。

評論

#1樓?[樓主] 2006-09-15 15:36 仰天一笑?????? 處理實例:
如果要在C#中定義一個事件,首先你要創造一個delegate(委派),用他來定義一個你所想使用事件的標簽,然后你才能使用event關鍵字,在這個委派的基礎上定義一個事件.

兩點需要注意的是:第一,首先你要創造一個委派,第二,根據你所創造的委派來定義一個事件,這才是一個完整的事件定義.

假設我們把書中的Product類進行增強.加入了一個NameChanged事件,此事件只有當Name通過屬性渠道被更改時就會發生.而如果私有變量name是通過類的內部代碼被修改時,此事件不會發生.代碼如下:

public class Product
{
public delegate void NameChangedEventHandler();//定義了事件
public event NameChangedEventHandler NameChanged;//事件的調用NameChanged
public string Name
{
get{return name;}
set{name = value;
if(NameChanged != null)
{
NameChanged();
}
}
}
}

上一課中的初始化函數Product(參數1,參數2)就無法引發事件,因為此時的name是通過內部被修改的,所以這樣定義的時候,當對象被實例話的時候事件不會發生,但當對象的name屬性通過saleProduct.Name = "ABCDEFG"被更改時,就會引發事件.

在此處我們可以看到,當事件發生時,還沒有執行任何實際的代碼,要處理事件,你必須要建立一個對應此事件的子程序,此子程序所包含的內容就是當一個事件發生時,所要處理的一系列的操作,然后連接子程序到事件.要控制Product類,你需要在另外一個類中定義一個事件鉤子(Event Handler).此事件鉤子要與事件(Event)有著相同的語法,例如,在Product類中事件是沒有返回參數也沒有參數的,所以事件鉤子要與之一致,形式如下:

public void ChangeDetected()

{//此處的代碼就是事件發生時要處理的代碼}

下一步就是將事件鉤子與事件進行掛鉤,首先做一個delegate指向事件鉤子,然后使用+=符號,把delegate附加到事件上面去: 代碼如下:

Product saleProduct = new Product();

saleProduct.NameChanged += new NameChangedEventHandler(ChangeDetected);

現在,當saleProduct.Name = "Kitchen Garbage"執行時,事件就會發生,而發生所要處理的具體操作則寫在ChangeDetected()里面.


?

轉載于:https://www.cnblogs.com/lindayyh/archive/2008/12/10/1351500.html

總結

以上是生活随笔為你收集整理的C#-委托和事件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。