- 浏览: 79005 次
文章分类
- 全部博客 (48)
- AOP (0)
- ASP.NET (1)
- C# (0)
- Community Server (0)
- Database (0)
- Design Pattern (3)
- JAVA (1)
- JavaScript (1)
- Linux (1)
- O/R Mapping (0)
- OO (3)
- SQL Server (1)
- VB.NET (0)
- Visual Studio 2005 (2)
- Windows (2)
- WPF (0)
- XML/XSLT (0)
- 常用工具类 (0)
- 人生感悟 (0)
- 算法 (0)
- 转载 (5)
- [网站分类]1.首页原创精华.NET区(包含架构设计、设计模式)(对首页文章的要求:原创、高质量、经过认真思考并精心写作) (3)
- [网站分类]2..NET新手区(用于发表不合适发表在首页的.NET技术文章,包括小经验、小技巧) (15)
- [网站分类]3.非技术区(技术之外的文章,但不要涉及任何政治内容) (2)
- [网站分类]4.其他技术区 (4)
- [网站分类]5.企业信息化 (0)
- [网站分类]6.读书心得区(技术书籍阅读心得、书籍推荐) (0)
- [网站分类]7.提问区(.NET技术方面的提问) (0)
- [网站分类]8.技术转载区(.NET技术文章转载, 请注明原文出处) (1)
- [网站分类]9.求职招聘区(个人求职、企业招聘) (0)
- [网站分类]Dottext区 (0)
- [网站分类]GIS技术 (0)
- [网站分类]IT英才专区(IT职场交流) (0)
- [网站分类]SharePoint (0)
- [网站分类]博客园.NET俱乐部(俱乐部组织与活动方面的文章) (0)
- [网站分类]软件发布区(发布自己开发的代码、软件) (0)
- [网站分类]网站管理区(网站管理方面的疑问、建议、意见, 寻求管理员帮助) (0)
- [网站分类]业界新闻 (0)
最新评论
-
xjw1987524:
这个问题我是弄啦很久,我也试过反编译,不知道为什么就是不成功; ...
支持中文参数的 jspSmartUpload
一、什么是委托
下面引用自 MSDN
委托类型声明的格式如下:
delegate 关键字用于声明一个引用类型,该引用类型可用于封装命名方法或匿名方法。委托类似于 C++ 中的函数指针;但是,与函数指针不同,委托是面向对象和类型安全的。
通过将委托与命名方法或匿名方法关联,可以实例化委托。与之关联的匿名方法必须除了方法名之外参数类型、参数个数、参数顺序和返回值都必须和声明的委托类型保持一致。
对于可隐式转换的参数和返回值类型处理可查阅 MSDN。
看看《.NET 大局观》第2版中对委托的定义:委托是指向方法的一个安全可靠的指针。所有 delegate 都继承自一个共同的 System.Delegate 类型,通常用于事件的处理和回调(callbacks)。每个委托都关联一系列成员,称为调用列表(invocation list)。一旦委托被调用,列表中的每一个成员也都会被调用,并获得委托所收到的参数。
二、委托是什么?
上面已经提到了什么是委托,现在又反问了委托是什么,这不是吃饱饭没事做忽悠人吗?
当然不是,上面的问题是从委托本身狭小的范围来说事的,现在是要在超出委托定义的范围来说明。
为了看清委托的真面目,我们来创建一个委托类型
{
public delegate void SampleDelegate(string message);
}
再用 ildasm 打开编译后的 dll 查看生成的 IL 代码,结果如下:
没有搞错,委托其实也只是一个类,它派生自 System.MulticastDelegate。
既然委托是一个类,那它实例化出来的当然也是一个对象,它存储了一个类的方法的引用。这点对于用惯了 .NET 或者 JAVA 的用户来说不是很好理解,因为在他们的潜意识中已经把方法当成了语言的语法特性,它们可以被定义,被调用,但却不是数据类型,其实这样理解也是正确无误的,但却对我们理解方法引用造成一些障碍,直到有一天看《JS 权威指南》中对函数的介绍时忽然茅塞顿开,因为在 js 中它把函数也当成一种数据类型处理,如果在委托中也把方法当成一种数据类型看待呢?一个方法同样同样也是需要被分配一定范围内存空间的,同样也可以通过地址访问,委托存储的就是它的地址引用。
总结:委托是一个定义签名的类型,即方法的返回值类型和参数列表类型。可以使用委托类型来声明一个变量,该变量可以引用与委托签名相同的所有方法。
C#高级编程(第4版)中提到:理解委托的一种好方式是把委托的作用当作是给方法签名指定名称。
三、什么是事件
下面的解释来自MSDN,基本上已经能说明事件的概念了:
.NET 使用 event 关键字来指定事件。
事件是类在发生其关注的事情时用来提供通知的一种方式。例如,封装用户界面控件的类可以定义一个在用户单击该控件时发生的事件。控件类不关心单击按钮时发生了什么,但它需要告知派生类单击事件已发生。然后,派生类可选择如何响应。
事件使用委托来为触发时将调用的方法提供类型安全的封装。委托可以封装命名方法和匿名方法。
事件具有以下特点:
* 事件是类用来通知对象需要执行某种操作的方式。
* 尽管事件在其他时候(如信号状态更改)也很有用,事件通常还是用在图形用户界面中。
* 事件通常使用委托事件处理程序进行声明。
* 事件可以调用匿名方法来替代委托。
事件处理程序委托的标准签名定义一个没有返回值的方法,其第一个参数的类型为 Object,通常命名为 sender,它引用引发事件的实例,第二个参数从 EventArgs 类型派生,通常命名为 e,它保存事件数据。如果事件不生成事件数据,则第二个参数只是 EventArgs 的一个实例。否则,第二个参数为从 EventArgs 派生的自定义类型,提供保存事件数据所需的全部字段或属性。
四、 一个关于委托与事件的例子
下面是一个关于一个人从一个地方走到另一个地方的例子,Person 中包含一个方法 Move(),同时 Move() 会触发两个事件,一个是 OnBeginMove (在开始移动时发生),另一个是 OnEndMove (在到达目的地时发生),为了使其更像一个人,我们给它加上一个 Name 属性。
Person 类源代码:
namespace DelegateAndEvent
{
/**//// <summary>
/// 声明一个委托,用于代理一系列"无返回"及"不带参"的自定义方法
/// </summary>
/// <param name="sender">事件源</param>
/// <param name="e">不包含任何事件数据的 EventArgs</param>
public delegate void MyEventHandler(object sender, EventArgs e);
/**//// <summary>
/// 人类
/// </summary>
public class Person
{
/**//// <summary>
/// 在开始移动时发生
/// </summary>
public event MyEventHandler OnBeginMove;
/**//// <summary>
/// 在到达目的地时发生
/// </summary>
public event MyEventHandler OnEndMove;
private string _name;
/**//// <summary>
/// 名字
/// </summary>
public string Name
{
get { return _name; }
set { _name = value; }
}
/**//// <summary>
/// 移动
/// <remarks>封装了触发事件的方法</remarks>
/// </summary>
/// <param name="place">目的地</param>
public void Move(Place place)
{
// OnBeginMove 事件在这里被触发了
if (OnBeginMove != null)
OnBeginMove(this, EventArgs.Empty);
OnMove(place);
// OnEndMove 事件在这里被触发了
if (OnEndMove != null)
OnEndMove(this, EventArgs.Empty);
}
private void OnMove(Place place)
{
Console.WriteLine("我走啊走啊走啊走.");
Console.WriteLine("我已经走到 x={0} y={1} 的位置", place.X, place.Y);
}
}
}
Place 类源代码:
namespace DelegateAndEvent
{
public class Place
{
private int _x;
private int _y;
public Place() { }
public Place(int x, int y)
{
this._x = x;
this._y = y;
}
public int X
{
get { return _x; }
set { _x = value; }
}
public int Y
{
get { return _y; }
set { _y = value; }
}
}
}
客户端原代码:
namespace DelegateAndEvent
{
public class Program
{
static void Main(string[] args)
{
// 创建一个 Person 的新实例
Person Yyw = new Person();
// 将事件与委托绑定
// 这里使用了命名委托
Yyw.OnBeginMove += new MyEventHandler(Yyw_OnBeginMove);
// 这里使用了匿名委托(C# 2.0 的新特性)
Yyw.OnEndMove += delegate(System.Object sender, System.EventArgs e)
{
Console.WriteLine("我已经走到了尽头");
};
Place place = new Place(10, 20);
// 到那边去
Yyw.Move(place);
Console.Read();
}
static void Yyw_OnBeginMove(object sender, EventArgs e)
发表评论
-
获取某目录下的所有文件(包括子目录下文件)的数量(C#)
2005-11-04 17:27 3993以前写过一个通过计算目录遍历所有文件和子目录的方法来获得某目录 ... -
Visual Studio 2005 试用笔记
2005-11-06 21:36 942今天开始用上了 VS 2005 ... -
C#面向对象设计模式纵横谈(2):Singleton 单件(创建型模式) 笔记
2005-11-09 22:52 1316(很喜欢李建忠老师的这个讲座,可惜暂时没更多的了,继续关注 M ... -
利用视图管理器高效编写 SQL SELECT 语句
2006-02-19 13:27 973献给初学者,老鸟别扔砖头 编写 ... -
将Web站点下的绝对路径转换为虚拟路径
2006-05-07 12:48 1219很经常使用到的一个功能,但在在网上却一直没有找到相关的解决方法 ... -
比较高效地实现从两个不同数组中提取相同部分组成新的数组(只支持Int类型) [C#]
2006-05-13 22:17 4050有时候我们需要从两个不同数组中提取出相同的部分 ... -
基于 .NET 2.0 System.Net.Mail namespace 的邮件发送组件
2006-05-17 13:11 1889一个基于 .NET 2.0 System.Net.Mail n ... -
从 CCS 1.1 升级到 CS 2.0 所遇到的问题和部分解决方法
2006-06-16 12:58 835整理了一下,记录在这 ... -
.NET Enum The Next Level
2006-08-20 17:15 1176声明:本文内容出自:http://www.codeprojec ... -
C# 中实现随机时间的获取
2006-09-07 17:31 1369原理其实非常简单,取出两个时间差的秒数,再在0到该秒数 ... -
NHibernate 实体类中重写 Equals() 和 GetHashCode()
2006-09-17 17:08 1557在正常的对象操作中,当两个对象都是通过 new ... -
初识 db4o
2006-10-25 21:41 944今天早上收到 IBM developerWork ... -
Spring.Net AOP 学习之旅: 使用 Throws Advice 处理异常
2006-10-30 21:12 4341写在前头:本文示例和部分文字来自《Sprin ... -
.NET 1.1 下不使用 System.Web.Mail.SmtpMail 发送邮件的其它选择
2006-12-22 20:35 1250最近工作原因需要维护 ASP.NET 1.1 的程 ...
相关推荐
本文将深入探讨.NET委托和事件,以及它们如何在实际应用中发挥作用。 首先,我们需要了解什么是委托。委托在.NET中可以被视为类型安全的函数指针,它允许我们将方法作为参数传递,或者存储方法以便稍后调用。这种...
在.NET框架中,C#语言提供了委托...在ASP.NET中,委托和事件是构建交互式Web应用程序的关键工具,通过订阅和发布事件,可以实现用户界面与业务逻辑的解耦。理解和熟练运用委托调用事件是每个.NET开发者的必备技能。
在类中,我们可以使用`event`关键字声明一个事件,它通常与一个委托类型关联。 ```csharp public event MyEventHandler MyEvent; ``` 2. **引发事件:** 当满足特定条件(如用户点击按钮)时,事件源(如按钮...
VB.NET中的委托是实现事件处理、回调函数和异步编程的关键概念。让我们通过这个“vb.net 最简单的理解委托”的主题,深入探讨委托的原理、用法以及如何在实际编程中应用。 首先,我们需要了解什么是委托。委托是一...
C#,.NET,委托,事件,电子书 C#,.NET,委托,事件,电子书 C#,.NET,委托,事件,电子书 C#,.NET,委托,事件,电子书 C#,.NET,委托,事件,电子书 C#,.NET,委托,事件,电子书 C#,.NET,委托,事件,...
.net委托与事件设计模式我作为初学者理解了很久,借鉴了别人的成果自己写了一个易懂的代码,希望对初学者有用。
ASP.NET中的事件和委托是.NET框架中非常重要的概念,它们在构建动态、响应用户交互的Web应用程序时起着核心作用。本文将通过一个简单的C#示例,深入探讨这两个概念及其在实际编程中的应用。 首先,让我们理解什么是...
根据提供的信息,我们可以深入探讨.NET委托(Delegate)的相关概念及其在C#中的应用。下面将详细解释委托的基本概念、用途以及如何在实际编程场景中使用它们。 ### 委托的基本概念 在.NET框架中,委托是一种引用...
在.net框架中,事件是将事件发送者(触发事件的对象)与事件接受者(处理事件的方法)相关联的一种代理类,即事件机制是通过代理类来实现的。当一个事件被触发时,由该事件的代理来通知(调用)处理该事件的相应方法
在VB.NET编程中,委托是一种强大的工具,它允许我们把方法作为参数传递,或者实现事件处理。本篇文章将深入探讨委托的概念,以及如何在VB.NET中声明和使用它们,通过一个具体的实例进行详细讲解。 首先,理解委托的...
在.NET框架中,事件和委托是两种至关重要的概念,它们为对象间的通信提供了一种安全、灵活的方式。本文将深入探讨C#中的事件和委托,以及它们如何在实际编程中应用。 首先,让我们来理解什么是委托。在C#中,委托是...
在.NET框架中,委托是一种类型安全的函数指针,它允许我们传递方法作为参数或存储在变量中。在本文中,我们将深入探讨如何在窗体(Form)之间使用委托进行值传递,特别是在C#和.NET环境中。这个话题是基于一个实际的...
.NET Framework中的委托和事件是C#编程中两个关键的概念,它们在实现事件驱动编程和回调机制方面发挥着重要作用。委托可以被理解为一种类型安全的函数指针,允许我们将方法作为参数传递给其他方法,或者存储在一个...
在.NET Framework中,C#的委托和事件是两种强大的特性,它们在构建可复用、模块化和响应式代码方面发挥着关键作用。首先,让我们深入理解委托。 委托在C#中可以被视为一种类型,它封装了对方法的引用。简单来说,...
本实例将深入探讨如何使用VB.NET的事件委托来实现这一目标,特别是在Windows Forms应用中。首先,理解事件和委托是关键。 事件是类(控件)中定义的一种特殊类型的方法,它在特定条件满足时被触发。委托则是类型...
在.NET框架中,C#和VB.NET提供了强大的事件处理机制,这一机制的核心概念就是“委托”。委托在编程中可以理解为一种类型,它代表了一组方法的集合,这些方法具有相同的返回类型和参数列表。本示例将深入探讨如何在C#...
### C#.NET中的委托和事件 #### 委托 在C#.NET中,委托是一种引用类型的数据结构,它封装了方法的引用。通过委托,我们可以将方法作为参数进行传递,或者将方法作为对象属性存储起来。这为C#.NET中的事件处理、回...