码迷,mamicode.com
首页 > Windows程序 > 详细

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

时间:2018-04-22 13:58:18      阅读:251      评论:0      收藏:0      [点我收藏+]

标签:control   else   委托和事件   定义   generic   htm   font   mod   sys   

委托和事件在 .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)

标签:control   else   委托和事件   定义   generic   htm   font   mod   sys   

原文地址:https://www.cnblogs.com/gygtech/p/8906657.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!