委托和事件在 .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. 集合遍历元素的3种方法:for、foreach、迭代器iterator

    1.for循环方式(Set集合不能使用,因为Set是无序的没有索引) for (int i = 0; i < list.size(); i++) { Object o = list.get(i) ...

  2. 使用turtle库绘制同心圆

    import turtle as t t.pensize(3) t.setup(600,600,50,50) t.pencolor("yellow") t.penup() t.pe ...

  3. Java实现 蓝桥杯 一步之遥

    一步之遥 从昏迷中醒来,小明发现自己被关在X星球的废矿车里. 矿车停在平直的废弃的轨道上. 他的面前是两个按钮,分别写着"F"和"B". 小明突然记起来,这两个 ...

  4. 第六届蓝桥杯JavaA组国(决)赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.胡同门牌号 小明家住在一条胡同里.胡同里的门牌号都是连续的正整数,由于历史原因,最小的号码并不是从1开始排的. 有一天小明突然发现了有 ...

  5. lambda表达式操作DataTable番外篇

    using System;using System.Collections.Generic;using System.Data;using System.Linq;using System.Text; ...

  6. .NET Core Session源码探究

    前言     随着互联网的兴起,技术的整体架构设计思路有了质的提升,曾经Web开发必不可少的内置对象Session已经被慢慢的遗弃.主要原因有两点,一是Session依赖Cookie存放Session ...

  7. tensorflow2.0学习笔记第一章第四节

    1.4神经网络实现鸢尾花分类 import tensorflow as tf from sklearn import datasets import pandas as pd import numpy ...

  8. Nginx思维导图

    1. Nginx简介 1.1 nginx概述 1.2 nginx的安装及程序环境 1.3 零复制&五种IO模型 1.4 nginx的基本配置 2. Nginx配置详解 2.1 main配置段详 ...

  9. @codeforces - 607E@ Cross Sum

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定 n 条直线,构造可重点集合 I 为 n 条直线两两的交点集 ...

  10. 解决GITLAB无法启动runsv no running

    可以先尝试用 systemctl start gitlab-runsvdir.service 如果冻结不动的话,就需要查看系统服务项了 systemctl -t target 如果系统正常的话,所有任 ...