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

简介:

专题图:ylbtech-.net 编号:ylbtech  DotNet100010010

内容简介

1,什么是委托(Delegate)?2,委托的实际应用有哪些?3,两个委托(Delegate)实例解析(3a,不同语言的问候。3b,中文版QQ和Tencent QQ(国际版QQ)用户个人信息的性别呈现。)。 4,使用委托(Delegate)有哪些好处?5,精讲案例下载。

 

技术与环境

操作系统:

windows

语言类别:

C#

thankyou: sunshine, 谢谢你的默默付出

课题:

委托(Delegate)

学习软件:

Microsoft Visaul Studio 2010

课程总策划:

yuanbo

English name:

sunshine

个人主页:

http://www.cnblogs.com/ylbtech/

科研团队:

ylbtech

教研团队:

ylbtech

 

1,什么是委托(Delegate)和事件(Event)?
  委托和事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易。它们就像是一道槛儿,过了这个槛的人,觉得真 是太容易了,而没有过去的人每次见到委托和事件就觉得心里憋得慌,浑身不自在。本文中,我将通过两个范例由浅入深地讲述什么是委托、为什么要使用委托、事 件的由来、.Net Framework中的委托和事件、委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论。
 
P1:什么是委托?事件是委托吗?
答:委托可以把一个方法当作一个参数带入另一个方法。
       也可以简单地理解为一个指向函数的引用。
       是,一种特殊的委托。
 
2,委托的实际应用有哪些?

   我举两个实例。

1,[3a]不同语言的问候。

2,[3b]中文版QQ和Tencent QQ(国际版QQ)用户个人信息的”性别“呈现。

 

3,两个委托(Delegate)实例解析。

 

ylb_menu:3a,一个不同语言的问候,示例:

 

using  System;
 
namespace  ConsoleApplication1
{
     class  Program
     {
         /// <summary>
         /// ylb:委托的使用
         /// </summary>
         /// <param name="args"></param>
         static  void  Main( string [] args)
         {
             //调用委托问候方法
             GreatPeople( "xiaoming" , EngGreating);
             GreatPeople( "小明" , ChiGreateing);
 
         }
 
         /// <summary>
         /// 1, 声明一个问候委托
         /// </summary>
         /// <param name="name"></param>
         private  delegate  void  GreatingDelegate( string  name);
 
         /// <summary>
         /// 2,英式问候
         /// </summary>
         /// <param name="name"></param>
         private  static  void  EngGreating( string  name)
         {
             Console.WriteLine( "Hallo "  + name);
         }
 
         /// <summary>
         /// 3,中式问候
         /// </summary>
         /// <param name="name"></param>
         private  static  void  ChiGreateing( string  name)
         {
             Console.WriteLine( "您好,"  + name);
         }
 
         /// <summary>
         /// 4,问候转换
         /// </summary>
         /// <param name="name"></param>
         /// <param name="greatPeople"></param>
         private  static  void  GreatPeople( string  name, GreatingDelegate greatPeople)
         {
             greatPeople(name);
         }
     }
}

 

ylb_menu:3b,中文版QQ和Tencent QQ(国际版QQ)用户个人信息的”性别“呈现。示例:

3b_1,  /App_Code/SexConvertFun.cs

using  System;
 
/// <summary>
///SexConvertFun 的摘要说明
/// </summary>
public  class  SexConvertFun
{
     /// <summary>
     /// 声明一个性别委托
     /// </summary>
     /// <param name="sex"></param>
     /// <returns></returns>
     public  delegate  string  SexDelegate( string  sex);
 
     /// <summary>
     /// ylb:1, 中文转换
     /// </summary>
     /// <param name="sex"></param>
     /// <returns></returns>
     public  static  string  ChiSex( string  sex)
     {
         string  changeAfterTheSex = string .Empty;
         switch  (sex)
         {
             case  "M" :
                 changeAfterTheSex = "男" ;
                 break ;
             case  "F" :
                 changeAfterTheSex = "女" ;
                 break ;
             case  "N" :
                 changeAfterTheSex = "未知" ;
                 break ;
 
         }
         return  changeAfterTheSex;
     }
     /// <summary>
     /// ylb:2,英文转换
     /// </summary>
     /// <param name="sex"></param>
     /// <returns></returns>
     public  static  string  EngSex( string  sex)
     {
         string  changeAfterTheSex = string .Empty;
         switch  (sex)
         {
             case  "M" :
                 changeAfterTheSex = "Male" ;
                 break ;
             case  "F" :
                 changeAfterTheSex = "Female" ;
                 break ;
             case  "N" :
                 changeAfterTheSex = "Unknown" ;
                 break ;
 
         }
         return  changeAfterTheSex;
     }
 
     /// <summary>
     /// 性别转换
     /// </summary>
     /// <param name="sex"></param>
     /// <param name="sexConvert"></param>
     /// <returns></returns>
     public  static  string  SexConvert( string  sex, SexDelegate sexConvert)
     {
         return  sexConvert(sex);
     }
 
     public  SexConvertFun()
     {
         //
         //TODO: 在此处添加构造函数逻辑
         //
     }
}

 3b_2,  /delegateDmo.aspx

复制代码
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="delegateDemo2.aspx.cs" Inherits="delegateDemo" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
   <div>
    <h2>委托(Delegate)实际应用</h2>
    <hr />
    我们以QQ的两个版本解释委托的必要性,1:中文板。2,国际版。<br />
       <br />
    以性别为例,若一个若用性别为女,我们在数据库的用户表的sex列存的值为“F”
    ,则:在中文版性别应该显示女,在国际版性别应该显示Famale。<br />
&nbsp;<hr />
    中文版<br />

    性别:<%=SexConvertFun.SexConvert("F",SexConvertFun.ChiSex) %>

    <br />
        <br />
    <br />
     <hr />
    国际版<br />

    sex:<%=SexConvertFun.SexConvert("F",SexConvertFun.EngSex) %>
    </div>
    </form>
</body>
</html>
复制代码

 

 

4,使用委托(Delegate)有哪些好处?

    我们现在对委托做一个总结:

  委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。

 

5,精讲案例下载

http://code.google.com/p/ylbtechdotnet/downloads/list

请单击“ylbtech-DotNet-100010010-Delegate”下载

 

本文转自ylbtech博客园博客,原文链接:http://www.cnblogs.com/ylbtech/archive/2012/08/22/2649334.html,如需转载请自行联系原作者

相关文章
|
7月前
|
开发框架 安全 .NET
C# .NET面试系列三:集合、异常、泛型、LINQ、委托、EF!
<h2>集合、异常、泛型、LINQ、委托、EF! #### 1. IList 接口与 List 的区别是什么? IList 接口和 List 类是C#中集合的两个相关但不同的概念。下面是它们的主要区别: <b>IList 接口</b> IList 接口是C#中定义的一个泛型接口,位于 System.Collections 命名空间。它派生自 ICollection 接口,定义了一个可以通过索引访问的有序集合。 ```c# IList 接口包含一系列索引化的属性和方法,允许按索引访问、插入、移除元素等。 由于是接口,它只定义了成员的契约,而不提供具体的实现。类似于 IEnumera
367 2
|
7月前
VB.NET—窗体引起的乌龙事件
VB.NET—窗体引起的乌龙事件
67 0
|
C++
【.Net】使用委托实现被引用的项目向上级项目的消息传递事件
在实际项目过程中,经常可能遇到被引用的项目要向上传递消息,但是又不能通过方法进行返回等操作,这个时候委托就派上用场了。以下使用委托,来实现被引用的项目向上传递消息的小教程,欢迎各位大佬提供建议。1、新增控制台项目(一般在CS架构中会用的比较多,用于跨线程传递消息使用)。此处用一个控制台项目来模拟演示使用委托进行消息事件的传递教程。
108 0
【.Net】使用委托实现被引用的项目向上级项目的消息传递事件
|
3月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
51 7
|
3月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
82 0
|
4月前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
60 0
|
4月前
|
开发框架 前端开发 安全
ASP.NET MVC 如何使用 Form Authentication?
ASP.NET MVC 如何使用 Form Authentication?
|
4月前
|
开发框架 .NET
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
151 0
|
7月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
214 0