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

歡迎訪問 生活随笔!

生活随笔

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

C#

C#知识点总结系列:3、C#中Delegate和Event

發布時間:2025/3/15 C# 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#知识点总结系列:3、C#中Delegate和Event 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、Delegate委托可以理解為一個方法簽名。

    可以將方法作為另外一個方法的參數帶入其中進行運算。在C#中我們有三種方式去創建委托,分別如下:

public delegate void Print(string str);static void delegatemethod(string str){Console.WriteLine(str);}public static void Main(){#region 委托//1.普通委托var print1 = new Print(delegatemethod);print1("這是普通方式創建的委托");//2.匿名委托Print print2 = delegate(string str) {Console.WriteLine(str);};print2("這是匿名方式創建的委托");//3.lambda委托Print print3 = (string str) => {Console.WriteLine(str);};
}

  二、Event事件,是一種封裝過的委托。

    它擁有以下三要素:

    1.事件發行者-達到某些條件時激發事件的對象

    2.事件訂閱者-訂閱事件并對事件發生時進行處理的對象

    3.定義發行者和訂閱者關系,一個發行者可能會有多個訂閱者。

  三、事件和委托的區別

    1.委托允許直接通過委托去訪問相應的處理函數,而事件只能通過公布的回調函數去調用

    2.事件只能通過“+=”,“-=”方式注冊和取消訂戶處理函數,而委托除此之外還可以使用“=”直接賦值處理函數。

  最后我們可以看看整個自定義事件的處理辦法以及事件和委托的區別如下代碼:

//事件參數public class My_EventArgs : EventArgs{private string _args = string.Empty;public My_EventArgs(string args){_args = args;}public string Args{get { return _args; }}}//事件發行者public class SourceClass{public double Width { get; set; }public double Height { get; set; }My_EventArgs Evargs;public SourceClass(string args){Evargs = new My_EventArgs(args);}//定義委托public delegate void EventHandler(object sender, My_EventArgs args);#region 使用委托方式聲明public EventHandler Clicked;public void ClickedAsync(){if (Clicked != null){Clicked(this, Evargs);}}#endregion#region 使用事件方式聲明public event EventHandler Click;public void ClickAsync(){if (Click != null){Click(this, Evargs);}}#endregion}//事件訂閱者public class Del{public delegate void Print(string str);static void delegatemethod(string str){Console.WriteLine(str);}public static void Main(){#region 委托//1.普通委托var print1 = new Print(delegatemethod);print1("這是普通方式創建的委托");//2.匿名方法
Print print2 = delegate(string str) {Console.WriteLine(str);};print2("這是匿名方法創建的委托");//3.lambda委托Print print3 = (string str) => {Console.WriteLine(str);};print3("這是lambda方式創建的委托");#endregion#region 事件SourceClass source = new SourceClass("我的事件被觸發");source.Width = 5.0;source.Height = 3.0;//一、委托方式允許source.Clicked(source, new My_EventArgs("我使用委托方式調用的Args"));調用source.Clicked = new SourceClass.EventHandler(source_RightClick);source.Clicked += new SourceClass.EventHandler(source_LeftClick);source.ClickedAsync();source.Clicked(source, new My_EventArgs("我使用委托方式調用的Args"));//二、很明顯用戶希望通過使用source.ClickedAsync();去調用函數,而非直接使用上行代碼去調用,所以在這里需要使用Event關鍵字進行申明//注1.事件方式不允許source.Clicked(source, new My_EventArgs("我使用委托方式調用的Args"));直接調用//注2.事件不允許 source.Click = new SourceClass.EventHandler(source_LeftClick);直接賦值source.Click += new SourceClass.EventHandler(source_LeftClick);source.ClickAsync();//注銷事件和注冊事件source.Click -= new SourceClass.EventHandler(source_LeftClick);source.Click += new SourceClass.EventHandler(source_RightClick);source.ClickAsync();Console.ReadLine();#endregion}//事件處理方法1static void source_LeftClick(object sender, My_EventArgs args){SourceClass source = sender as SourceClass;Console.WriteLine("目標寬度:" + source.Width + ",目標高度:" + source.Height);Console.WriteLine("目標對象參數:"+args.Args);}//事件處理方法2static void source_RightClick(object sender, My_EventArgs args){SourceClass source = sender as SourceClass;Console.WriteLine("目標面積:" + source.Width *source.Height);}}

?  運行的效果圖如下:

?

轉 https://www.cnblogs.com/chengxingliang/archive/2013/05/21/3051912.html

轉載于:https://www.cnblogs.com/asdyzh/p/9885666.html

總結

以上是生活随笔為你收集整理的C#知识点总结系列:3、C#中Delegate和Event的全部內容,希望文章能夠幫你解決所遇到的問題。

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