Asp.net中的委托

相信大家也不是第一次听说过委托这个概念,之前一直了解,却没有去好好地总结,正好最近有机会,让我们来看看到底什么是委托吧?

首先,我们要知道什么是委托?

委托是一种特殊的类型(class),用途是来实现对一种方法的封装。在某种事件发生时,自动调用该方法。

一个委托代表了具有相同参数列表和返回值的所有函数。类是对象的抽象,委托是函数的抽象。

简单理解Delegate委托(或代理)是一种数据类型:它的变量可以引用到某一个符合要求的方法上,通过委托可以间接地调用该方法。

其次,定义知道了,怎么去用呢?可以把委托的使用分为四部:

1.定义一种委托。

2.委托执行时要调用方法。

3.定义一个委托实例。

4.委托实例的调用。

<div><pre name="code" class="csharp"><span style="font-size:18px;">  //定义一种委托。
delegate int GetCalculatedValueDelegate(int x, int y);   
  //委托执行时要调用方法。
static int AddCalculator(int x, int y)   
{   
    return x + y;   
}   
  
static int SubCalculator(int x, int y)   
{   
    return x - y;   
}   
  
static void Main(string[] args)   
{   
    //定义一个委托实例。
    GetCalculatedValueDelegate d = AddCalculator;   
   //委托实例的调用。
    Console.WriteLine(d(10, 20));   
}   </span>

这样,我们就会发现,其实委托没有我们想象中的那么难。

最后,我们为什么要用它,它有什么优点?我们再来看一个例子。

<span style="font-family:KaiTi_GB2312;font-size:18px;">/// <summary>
        /// the English speaker.
        /// </summary>
        /// <param name="name">The name.</param>
        public void EnglishSpeaker(string name)
        {
            Console.WriteLine(
                string.Format("Hello my name is {0} and I am English speaker.\n", name));
        }
        /// <summary>
        /// the Chineses speaker.
        /// </summary>
        public void ChineseSpeaker(string name)
       {
            Console.WriteLine(
                string.Format("您好我的名字叫{0},我是讲普通话的。\n", name));
        }
/// <summary>
        /// 根据上下文调用不同的方法
        /// </summary>
        /// <param name="name">string</param>
        /// <param name="lang">enum</param>
        private static void Say(string name, Language lang)
        {
            switch (lang)
            {
                case Language.Chinese:
                    Program.ChineseSpeaker(name);
                    break;
                case Language.English:
                    Program.EnglishSpeaker(name);
                    break;
                default :
                    break;
            }
        }
 /// <summary>
         /// Define speak delegate.
        /// </summary>
         /// <param name="name"></param>
         private delegate void SpeakDelegate(string name);
/// <summary>
        /// The base say function.
        /// </summary>
        /// <param name="name">The name.</param>
        /// <param name="speaker">The speaker.</param>
        private static void Say(string name, SpeakDelegate speaker)
        {
            ///Inoke the speaker function.
            speaker(name);
        }
 ///传递函数名进行委托方法绑定
             Program.Say("钧航", ChineseSpeaker);
             Program.Say("JK.Rush", EnglishSpeaker);</span>

其实,这上面的也是四部。只不过通过这个例子,我们可以发现委托的优点。

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

委托没有想象的那么难,但是委托常常不会自己出现,就好比我们最近做的云平台底层,委托常常与泛型、反射等等一起出现,这样会造成一个假象,使我们觉得委托很难。这时候,我们应该逐一击破,到最后你会发现它没有那么难。

时间: 2024-08-06 20:08:50

Asp.net中的委托的相关文章

ASP.NET中定制自己的委托和事件参数类

本文笔记选自<庖丁解牛:纵向切入ASP.NET 3.5控件和组件开发技术>一书 一般在实际开发中,对于事件不需要传递数据信息时,像上面的KingTextBox控件的事件,在引发事件时传递的参数为EventArgs.Empty,如下所示:OnTextChanged(EventArgs.Empty);    这是因为控件KingTextBox的TextChanged事件比较简单,这里不需要参数对象传递数据.但像一些复杂的控件比如GridView的按钮命令事件,必须得有参数命令表示单击了哪个按钮:翻

关于asp.net中页面事件加载的先后顺序

一.ASP.NET 母版页和内容页中的事件 母版页和内容页都可以包含控件的事件处理程序.对于控件而言,事件是在本地处理的,即内容页中的控件在内容页中引发事件,母版页中的控件在母版页中引发事件.控件事件不会从内容页发送到母版页.同样,也不能在内容页中处理来自母版页控件的事件. 在某些情况下,内容页和母版页中会引发相同的事件.例如,两者都引发 Init 和 Load 事件.引发事件的一般规则是初始化事件从最里面的控件向最外面的控件引发,所有其他事件则从最外面的控件向最里面的控件引发. 请记住,母版页

ASP.NET中的事件处理

一.ASP.NET中的事件主要支持3个主要的事件组:1.包含在asp.net生成页面时自动生成,我们使用这些事件建立页面(如page_load等)2.包含了用户与页面交互时发生的所有事件(这种最强大)3.html内部的事件,这些事件在浏览器上执行(主要是由javascript来实现). 在C#语言中,事件的处理主要有两种方法:1.委托式事件处理模式(Delegation Event Model)   (VS2003中需要手工建立事件的委托关系,VS2005不需要了.)2.对可重载方法(Event

asp.ne中使用ajax和controller进行通信问题记录

为了页面显示和后端处理分离,使用了html+ajax+mvc的形式进行处理. 在这其中遇到的问题记录: 1. 在使用ajax向controller请求数据的时候,"get"方法会缓存上一次的请求,导致controller方法不能被debug跟踪到,开始以为是vs出错了,到后来才搞清楚. 解决方法:请求controller路径时加上随机数,或者使用"post"方法. 2. 在使用"POST"方法时,IE11要小心处理,因为ie会出现怎么都执行不了的

ASP.NET中的几种分页

1.通过DataGrid控件实现分页 ASP.NET中的DataGrid控件自带了分页功能,当绑定了DataGrid的数据源之后,须要对DataGrid控件进行一些设置: 左击控件右上角的小箭头→属性生成器: 选择左边的[分页]选项卡 选中[同意分页].[页大小]表示一页显示多少条数据:导航button的[位置]有顶.底.上下型三种选择.[模式]有页码和"上一页.下一页button".假设选择了页码模式.[数值button]表示最多显示的button数量,假设选择了还有一种模式,&qu

asp.net中session的原理及应用

Session简介丶特性 1.Session是一种Web会话中的常用状态之一. 2.Session提供了一种把信息保存在服务器内存中的方式.他能储存任何数据类型,包含自定义对象. 3.每个客户端的Seesion是独立存储的. 4.在整个会话过程中,只要SessionID的cookie不丢失,都会保存Session信息的. 5.Session不能跨进程访问,只能由该会话的用户访问.应为提取Session数据的id标识是以Cookie的方式保存到访问者浏览器的缓存里的. 6.当会话终止,或过期时,服

asp.net中javascript与后台c#交互

asp.net中javascript与后台c#交互 作者:熊猫大叔 字体:[增加 减小] 类型:转载 时间:2015-10-23我要评论,出处:http://www.jb51.net/article/73793.htm 这篇文章主要介绍了asp.net中javascript与后台c#交互,需要的朋友可以参考下 最近做一个小项目,网页中嵌入google maps,输入经纬度坐标可以定位地图位置并加注标记,点击标记获取远端摄像头数据并在视频窗口实现播放.在实际操作过程中,由于经纬度数据和视频登录的用

ASP.NET中Session的sessionState 4种mode模式

1. sessionState的4种mode模式 在ASP.NET中Session的sessionState的4中mode模式:Off.InProc.StateServer及SqlServer. 2. Off模式 <sessionState mode="Off"></sessionState> 关闭模式,即不需要使用Session. 单个页面关闭Session: <%@ Page EnableSessionState="false" %

ASP.NET中常用的优化性能的方法

1. 数据库访问性能优化  数据库的连接和关闭 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源.ASP.NET中提供了连接池(Connection Pool)改善打开和关闭数据库对性能的影响.系统将用户的数据库连接放在连接池中,需要时取出,关闭时收回连接,等待下一次的连接请求. 连接池的大小是有限的,如果在连接池达到最大限度后仍要求创建连接,必然大大影响性能.因此,在建立数据库连接后只有在真正需要操作时才打开连接,使用完