1. 程式人生 > >.Net: C#中的委托(Delegate)和事件(Event)

.Net: C#中的委托(Delegate)和事件(Event)

一道 中大 每次 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)