.Net: C#中的委托(Delegate)和事件(Event)
阿新 • • 發佈:2018-04-22
一道 中大 每次 summary lang tro 避免 strong lse 委托和事件在 .Net Framework中的應用非常廣泛,然而,較好地理解委托和事件對很多接觸C#時間不長的人來說並不容易。它們就像是一道檻兒,過了這個檻的人,覺得真 是太容易了,而沒有過去的人每次見到委托和事件就覺得心裏憋得慌,渾身不自在。本文中,我將通過兩個範例由淺入深地講述什麽是委托、為什麽要使用委托、事 件的由來、.Net Framework中的委托和事件、委托和事件對Observer設計模式的意義,對它們的中間代碼也做了討論。
P1:什麽是委托?事件是委托嗎?
答:委托可以把一個方法當作一個參數帶入另一個方法。
也可以簡單地理解為一個指向函數的引用。
是,一種特殊的委托。
2、委托的實際應用有哪些?
我舉兩個實例。
1,[3a]不同語言的問候。
2,[3b]中文版QQ和Tencent QQ(國際版QQ)用戶個人信息的”性別“呈現。
3、兩個委托(Delegate)實例解析。
using System; using System.Collections.Generic; using System.Linq; using System.Web; /// <summary> /// 語言類 /// </summary> namespace Gyg.DE.Models { public class Language {/// <summary> /// 聲明一個委托 /// </summary> /// <param name="name"></param> public delegate string GrateingDelegate(string name); /// <summary> /// 中式問候 /// </summary> /// <param name="name"></param> /// <returns></returns>public static string EngGrateing(string name) { return "英文名字=" + name; } /// <summary> /// 英式問候 /// </summary> /// <param name="name"></param> /// <returns></returns> public static string ChinaGreateing(string name) { return "中文名字=" + name; } public static string GreatePerpon(string name, GrateingDelegate gratePerpon) { return gratePerpon(name); } } }
案例2:
using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace Gyg.DE.Models { public class Sex { public delegate string SexDalegate(string sexCode); public static string ChinaSex(string sexCode) { switch (sexCode) { case "0": return "男"; case "1": return "女"; default: return "未知"; } } public static string EngSex(string sexCode) { switch (sexCode) { case "0": return "girl"; case "1": return "boy"; default: return "Unknown"; } } public static string SexConvert(string sexCode, SexDalegate sexConvert) { return sexConvert(sexCode); } } }
控制器代碼:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using Gyg.DE.Models; namespace Gyg.DE.Controllers { public class PerponController : Controller { // GET: Perpon public ActionResult Index() { string name = Language.GreatePerpon("顧牡丹", Language.ChinaGreateing); string nameEng = Language.GreatePerpon("gyg", Language.EngGrateing); ViewData["name"] = name; ViewData["nameEng"] = nameEng; return View(); } public ActionResult SexTest() { ViewData["ChinaSex"] = Sex.SexConvert("0", Sex.ChinaSex); ViewData["EngSex"] = Sex.SexConvert("1", Sex.EngSex); return View(); } } }
頁面代碼:
@{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Index</title> </head> <body> <div> @ViewData["name"] <br /> @ViewData["nameEng"] <br /> <a href="/Perpon/SexTest">SexTest</a> </div> </body> </html>
@{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>SexTest</title> </head> <body> <div> @ViewData["ChinaSex"] <br /> @ViewData["EngSex"] <br /> <a href="/Perpon/Index">Index</a> </div> </body> </html>
4、使用委托(Delegate)有哪些好處?
我們現在對委托做一個總結:
委托是一個類,它定義了方法的類型,使得可以將方法當作另一個方法的參數來進行傳遞,這種將方法動態地賦給參數的做法,可以避免在程序中大量使用If-Else(Switch)語句,同時使得程序具有更好的可擴展性。
.Net: C#中的委托(Delegate)和事件(Event)