委托和事件在 .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 "":
return "男";
case "":
return "女";
default:
return "未知";
}
} public static string EngSex(string sexCode)
{
switch (sexCode)
{
case "":
return "girl";
case "":
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("", Sex.ChinaSex);
ViewData["EngSex"] = Sex.SexConvert("", 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)的更多相关文章

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

    原文地址:C#中的委托(Delegate)和事件(Event) 作者:jiyuan51 把C#中的委托(Delegate)和事件(Event)放到现在讲是有目的的:给下次写的设计模式--观察者(Obs ...

  2. (转)C#中的委托(Delegate)和事件(Event)

    转自:http://blog.chinaunix.net/uid-576762-id-2733751.html   把C#中的委托(Delegate)和事件(Event)放到现在讲是有目的的:给下次写 ...

  3. 关于C# 委托(delegate)与事件(event)的用法及事例

    C#中的委托和事件对于新手可能会有一点难理解,所以先从一个小例子入手,以便能更好的理解其如何使用.有一个学生每天定闹钟在早上6点起床,所以当每天早上6点的时候,闹钟就会响起来,从而学生才会按时起床. ...

  4. 重温委托(delegate)和事件(event)

    1.delegate是什么 某种意义上来讲,你可以把delegate理解成C语言中的函数指针,它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m,说白了就是可以把方法当作 ...

  5. C#中的委托 Delegate(委托 也叫代表,代表一类方法)

    1. 委托类似与 C或C++中的函数指针,但委托是 面向对象的,并且是类型安全的 详情可查看官方文档:https://msdn.microsoft.com/en-us/library/ms173172 ...

  6. C#中的委托和事件(一)——delegate

    前言 来说一说委托(delegate)和事件(event),本篇采取的形式是翻译微软Delegate的docs中的重要部分(不要问我为什么微软的docs有中文还要读英文,因为读中文感觉自己有阅读障碍- ...

  7. 【温故知新】c#事件event

    从上一篇文章[温故知新]C#委托delegate可知,委托delegate和事件Event非常的相似,区别就是event关键字,给delegate穿上了个“马甲”. 让我们来看官方定义: 类或对象可以 ...

  8. c#中的delegate(委托)和event(事件)

    c#中的delegate(委托)和event(事件) 一.delegate是什么东西? 完全可以把delegate理解成C中的函数指针,它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能 ...

  9. 终于会用c#中的delegate(委托)和event(事件)了

    一.开篇忏悔 对自己最拿手的编程语言C#,我想对你说声对不起,因为我到现在为止才明白c#中的delegate和event是怎么用的,惭愧那.好了,那今天就趁月黑风高的夜晚简单来谈谈delegate和e ...

随机推荐

  1. Java中System的详细用法

    System.arraycopy System.arraycopy的函数原型是: public static void arraycopy(Object src, int srcPos, Object ...

  2. Java实现蓝桥杯历届试题填字母游戏

    题目描述 小明经常玩 LOL 游戏上瘾,一次他想挑战K大师,不料K大师说: "我们先来玩个空格填字母的游戏,要是你不能赢我,就再别玩LOL了". K大师在纸上画了一行n个格子,要小 ...

  3. Java实现第八届蓝桥杯最大公共子串

    最大公共子串 最大公共子串长度问题就是: 求两个串的所有子串中能够匹配上的最大长度是多少. 比如:"abcdkkk" 和 "baabcdadabc", 可以找到 ...

  4. java代码(11) ---java代码的优化

    java代码的优化 参考了一些Java开发手册有关代码的规范,觉得一段好的代码可以从三个维度去分析.1)性能,2)可扩展性,3)可读性 让我们看看别人是怎么去分析,还有值得我们去学习的地方,也是我正在 ...

  5. char 型变量中能不能存贮一个中文汉字?为什么?

    在c语言中,char类型占一个字节,而汉字占两个字节,所以不能存储. 在java语言中,char类型占两个字节,而java默认采用Unicode码是16位,所以一个Unicode码占两个字节,java ...

  6. 分享我在前后端分离项目中Gitlab-CI的经验

    长话短说,今天分享我为前后端分离项目搭建Gitlab CI/CD流程的一些额外经验. Before Gitlab-ci是Gitlab提供的CI/CD特性,结合Gitlab简单友好的配置界面,能愉悦的在 ...

  7. <WP8开发学习笔记>ApplicationBar(任务栏)的切换以及“黑条问题”

    ApplicationBar(以下简称AppBar)是WP应用相当常见的控件,也很方便.常见的做法是pivot或者panorama的页面切换的时候,AppBar跟随切换对应的按钮或者不显示按钮,如下图 ...

  8. Python函数&异常处理

    1. 函数基础 1.1 参数和返回值 1.1.1 参数 位置参数.关键字参数 def my_func1(x, y, z): print(x+y+z, "计算结束") my_func ...

  9. @atcoder - AGC029F@ Construction of a tree

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定 N - 1 个 {1, 2, ..., N} 的子集,第 ...

  10. 动作函数-web_custom_request

    web_custom_request("get_login", "URL=http://10.1.102.75:8000/login?user=Milton&pw ...