- 浏览: 614110 次
- 性别:
- 来自: 卡哇伊
文章分类
- 全部博客 (299)
- C# (25)
- Java (1)
- WinForm (0)
- Asp.Net (86)
- Jsp (2)
- Php (1)
- Web Service (0)
- Desgin Patterns (19)
- Data Structure & Algorithms (1)
- SQLserver (41)
- Mysql (0)
- Oracle (2)
- Javascript (50)
- Ajax (10)
- Jquery (1)
- Flex (0)
- Regular Expression (5)
- DIV+CSS+XHTML+XML (18)
- Software Test (0)
- Linux (0)
- Utility (17)
- Net Digest (4)
- windows 2003 (10)
- Other (4)
- English (1)
- IT Term (1)
最新评论
-
w497480098h:
学习了 很好谢谢
SQL Server下无限多级别分类查询解决办法(简单查询树形结构数据库表) -
main_fun:
确实不错
iframe自适应高度 -
jveqi:
...
DBA -
mxcie:
其它版本没有确认,今天使用vs2003时,其.sln文件也需要 ...
彻底删除项目的VSS源代码管理信息 -
moneyprosper:
就只有IE支持,火狐和谷歌都不支持此种方法。正在寻找中。。。
从父页面读取和操作iframe中内容方法
委托示例:
class Client { static void Main(string[] args) { Client client = new Client(); //创建委托,代理ByProxy方法,注意这里是方法名,不带括号! wt w = new wt(client.ByProxy); //调用被代理的方法,只需委托名加括号! w(); Console.ReadKey(); } //通过委托代理的方法返回值和参数必须和定义的委托匹配. public void ByProxy() { Console.WriteLine("我被委托调用啦。。。。"); } } /// <summary> /// 定义委托 /// </summary> public delegate void wt();
以上代码是没有意义的,只是要明白委托可以这样使用.
委托的作用:
1.在.net中委托是方法与事件的中间桥梁.一旦事件被触发,它肯定要
执行这个功能,而完成功能的是一个方法,委托是介于事件和方法之
间.
2.实现异步调用.
委托与事件示例:
class Client { static void Main(string[] args) { Client client = new Client(); //wt委托指向了ByProxy方法,事件通过委托调用方法(就是把ByProxy方法通过委托订阅到事件上了) sj+= new wt(client.ByProxy); //可以添加多个委托给事件 sj += new wt(client.ByProxy2); //可以重复添加调用 sj += new wt(client.ByProxy2); /*.net2.0开始可以这样简写,它会隐式转换为wt委托类型,然后 通过wt委托,调用被代理的方法(因为sj这个事件定义的时候就知道运用了wt这种委托,所以可以省略.如果ByProxy2方法不符合wt委托类型,会报错!) */ sj += client.ByProxy2; //调用事件,由于把事件定义为静态的否则要通过Client类的实例调用如:client.sj();委托调用和方法一样. sj(); //以上说明:事件其实是一个列表(事件列表)可以通过+=加载很多通过委托代理的方法 Console.ReadKey(); } //注意这里是静态的 public static event wt sj; public void ByProxy() { Console.WriteLine("我被委托调用啦。。。。"); } public void ByProxy2() { Console.WriteLine("我被委托调用啦。。。。"); } } /// <summary> /// 定义委托 /// </summary> public delegate void wt();
c#中的事件不可以在A类中显式的去调用B类的事件.
/// <summary> /// 举例在Client类中调用ABC中的事件 /// </summary> class Client { static void Main(string[] args) { ABC abc = new ABC(); abc.sj += new ABC.wt(abc.ByProxy);//这里这样调用会发生错误 abc.sj(); Console.ReadKey(); } } class ABC { public delegate void wt(); public event wt sj; public void ByProxy() { Console.WriteLine("我被委托调用啦。。。。"); } public void ByProxy2() { Console.WriteLine("我被委托调用啦。。。。"); } }
通过定义方法实现A类中调用B类的事件.
/// <summary> /// 举例在Client类中调用ABC中的事件 /// </summary> class Client { static void Main(string[] args) { ABC abc = new ABC(); abc.dy(); Console.ReadKey(); } } class ABC { public delegate void wt(); public event wt sj; public void ByProxy() { Console.WriteLine("我被委托调用啦。。。。"); } public void ByProxy2() { Console.WriteLine("我被委托调用啦。。。。"); } public void dy() { //通过定义方法实现A类中调用B类的事件. ABC abc = new ABC(); abc.sj += new wt(abc.ByProxy); abc.sj(); //this.sj += new wt(this.ByProxy); //sj(); } }
委托代理的方法不一定是自己类中的方法,可以代理其他类中的方法.只要该方法
与委托类型匹配即可!
class Client { static void Main(string[] args) { ABC abc = new ABC(); //调用触发事件的方法. abc.dy(); Console.ReadKey(); } //在Client中定义一个方法 public void ClientMethod() { Console.WriteLine("我被ABC类的wt委托代理了!"); } } class ABC { public delegate void wt(); public event wt sj; public void ByProxy() { Console.WriteLine("我被委托调用啦。。。。"); } public void ByProxy2() { Console.WriteLine("我被委托调用啦。。。。"); } public void dy() { ABC abc = new ABC(); //创建Client类实例 Client client = new Client(); //在abc类中通过wt委托代理client的ClientMethod abc.sj += new wt(client.ClientMethod); //调用事件. abc.sj(); } }
为什么要使用委托链?
delegate void EatDelegate(String food); /// <summary> /// 为什么要使用委托链? /// </summary> class Client { static void Main(string[] args) { /*张三李四王五都在吃同一样对象西瓜 为什么要输入三次这样很麻烦. * 可以通过委托链只输入一次西瓜同时调用三个函数 */ EatDelegate zs = new EatDelegate(Client.zsEat); EatDelegate ls = new EatDelegate(Client.lsEat); EatDelegate ww = new EatDelegate(Client.wwEat); zs("西瓜"); ls("西瓜"); ww("西瓜"); Console.ReadKey(); } public static void zsEat(String food) { Console.WriteLine("张三吃"+food); } public static void lsEat(String food) { Console.WriteLine("李四吃"+food); } public static void wwEat(String food) { Console.WriteLine("王五吃" + food); } }
使用委托链
delegate void EatDelegate(String food); /// <summary> /// 委托链的使用! /// </summary> class Client { static void Main(string[] args) { EatDelegate zs = new EatDelegate(Client.zsEat); EatDelegate ls = new EatDelegate(Client.lsEat); EatDelegate ww = new EatDelegate(Client.wwEat); //定义一个委托引用充当委托链 EatDelegate eatChain; //让他们相加赋值给eatChain,这样他们会依次去调用相加的委托所代理的方法 eatChain = zs + ls + ww; eatChain("西瓜"); //用+=的写法: //eatChain = zs; //eatChain += ls; //eatChain += ww; //当然通过-=号可以开除李四(ls)吃西瓜 eatChain -= ls; eatChain("西瓜"); //c#重载了+=和-=号来对委托链里的元素进行添加,删除操作. Console.ReadKey(); } public static void zsEat(String food) { Console.WriteLine("张三吃"+food); } public static void lsEat(String food) { Console.WriteLine("李四吃"+food); } public static void wwEat(String food) { Console.WriteLine("王五吃" + food); } }
委托代理匿名方法
delegate void EatDelegate(String food); /// <summary> /// 委托代理匿名方法 /// </summary> class Client { static void Main(string[] args) { EatDelegate eatChain = null; eatChain += delegate(String food){ Console.WriteLine("张三吃"+food); }; eatChain += delegate(String food) { Console.WriteLine("李四吃" + food); }; eatChain += delegate(String food) { Console.WriteLine("王五吃" + food); }; eatChain("西瓜"); Console.ReadKey(); } }
把委托当做方法的参数进行传递,并对它进行动态的调用.
delegate void EatDelegate(String food); /// <summary> /// 把委托当做方法的参数进行传递,并对它进行动态的调用. /// </summary> class Party { //通过定义可变的委托数组把委托当做参数传递. static void EatToghter(string food,params EatDelegate [] values) { if (values==null) { Console.WriteLine("坐谈会结束!"); } else { EatDelegate eatChain = null; foreach (EatDelegate ed in values) eatChain += ed; eatChain(food); } } static void Main(string[] args) { Man zs = new Man("张三"); Man ls = new Man("李四"); Man ww = new Man("王五"); EatDelegate zsd= new EatDelegate(zs.Eat); EatDelegate lsd= new EatDelegate(ls.Eat); EatDelegate wwd= new EatDelegate(ww.Eat); EatToghter("西瓜", zsd, lsd, wwd); Console.WriteLine("----------------------"); EatToghter("香蕉", zsd, lsd); Console.WriteLine("----------------------"); EatToghter(null,null); Console.ReadKey(); } } class Man { private string name; //通过定义构造函数来对委托进行动态调用 public Man(String name) { this.name = name; } public void Eat(string food) { Console.WriteLine(name+"吃"+food); } }
综合示例:
图:
示例代码1:
public class Publish //发行者(出版社) { public delegate void publish();//声明事件所需的代理 public event publish OnPublich;//事件的声明 /*发事件的方法(前面说过A类的事件不能在B类中触发, 需要在自己类中定义触发事件的方法,在B类中调用A类触发 事件的方法)*/ public void issue() { //如果事件不等于空发行刊物 if (OnPublich != null) { Console.WriteLine("发行刊物!"); this.OnPublich();//调用事件 } } } public class Subscriber //订阅者 { //在事件订阅者中定义事件处理程序 public void Receive() { Console.WriteLine("订阅者已经收到刊物!"); } } public class Story { public static void Main(String[] args) { //创建事件订阅者:张三 Subscriber zs = new Subscriber(); //创建事件发行者:出版社 Publish publish = new Publish(); //向事件发行者订阅一个事件 publish.OnPublich += new Publish.publish(zs.Receive); //调用触发事件的方法 publish.issue(); Console.ReadKey(); } }
出版社决定扩大规模,出版两种杂志(电脑杂志和生活杂志).
示例代码2:
/// <summary> /// 事件发行者 /// </summary> public class Publish { //发行电脑杂志事件所需的代理 public delegate void PubCompute(String magazineName); //发行生活杂志事件所需的代理 public delegate void PubLift(String magazineName); public event PubCompute OnPubCompute; public event PubLift OnPubLift; /// <summary> /// 触发电脑杂志事件的方法 /// </summary> public void Computeissue() { if (OnPubCompute != null) { Console.WriteLine("发行电脑杂质:"); OnPubCompute("电脑杂志"); } } /// <summary> /// 触发生活杂志事件的方法 /// </summary> public void Liftissue() { if (OnPubLift != null) { Console.WriteLine("发行生活杂志:"); OnPubLift("生活杂志"); } } } /// <summary> ///事件订阅者 /// </summary> public class Subscriber { private String name; public Subscriber(string name) { this.name = name; } public void Receive(string magazineName) { Console.WriteLine(name + "订阅了" + magazineName); } } public class Story { public static void Main(string[] args) { //创建出版社 Publish publish = new Publish(); //创建了订阅者张三 Subscriber zs = new Subscriber("张三"); //创建了订阅者李四 Subscriber ls = new Subscriber("李四"); //张三订阅了电脑杂志 publish.OnPubCompute += new Publish.PubCompute(zs.Receive); //李四订阅了电脑杂志 publish.OnPubCompute += new Publish.PubCompute(ls.Receive); //张三又订阅了生活杂志 publish.OnPubLift += new Publish.PubLift(ls.Receive); //出版社发行杂志了(调用触发事件的方法) publish.Computeissue(); publish.Liftissue(); Console.WriteLine("-----------------------------------------"); Console.WriteLine("一年后李四退定了电脑杂志!"); publish.OnPubCompute -= new Publish.PubCompute(ls.Receive); Console.WriteLine("一年出版社发行杂志!"); //出版社发行杂志了(调用触发事件的方法) publish.Computeissue(); publish.Liftissue(); Console.ReadKey(); } }
以上说明:事件发行者只会把事件发送给订阅该事件的用户.如果有多个
用户订阅了同个事件,那么该事件触发时,它就会把消息发送
给多个用户.
小结:
委托:
委托声明定义了一种类型,它用一组特定的参数以及返回类型来封装方法.对于静
态方法,委托对象封装要调用的方法.对于实例方法,委托对象同时封装一个实例和该实例
上的一个方法.如果你有一个委托对象和一组适当的参数(和委托类型相匹配的方法),
则可以用这些参数调用该委托.委托就是c++的函数指针,通过代理指向被代理的函数(方法)
不过c++只能指向静态方法.而委托除了可以指向静态方法还可以指向对象实例的方法.最大
的差异是委托是完全面向对象且使用安全的类型,另外委托可以在程序执行时传入方法的名称.
动态的决定预调用的方法.委托的本质就是一个类,凡可以声明类的地方都可以调用委托.
事件:
事件是类在发生其关注的事情时用来提供通知的一种方式.
例如,封装用户界面控件的类可以定义一个在用户单击该控件
时发生的事件.控件类不关心单击按钮时发生了什么,但它需要
告知派生类单击事件已发生.然后,派生类可选择如何响应.
事件发行者(Publisher):
一个事件发行者,也称作发送者(sender)或者事件源,其实就是一个对象,
这个对象自行维护本身的状态信息.当本身状态信息变动时,便触发一个事件,
并通知所有的事件订阅者.
事件订阅者(Subscriber):
对事件感兴趣的对象,也称接收这(Receiver),可以注册感兴趣的事件,通常需提供
一个事件处理程序,在事件发行者触发一个事件后,会自动执行这段代码.
定义一个完整事件的四个步骤:
1.在事件发行者中(发行者类中)定义一个事件
2.在事件发行者中(发行者类中)触发事件
3.在事件订阅者中定义事件处理程序(也就是被代理的方法,触发该事件执行的方法)
4.向事件发行者订阅一个事件(通过委托把被代理的方法(事件处理程序)订阅给事件发行者)
.Net Framework事件设计准则
1.事件的命名准则应使用PascalCasing命名方式(每个单词首字母大写.)
2.声明delegate时,使用void类型当做返回值,因为事件它的本质是委托链
一个委托链可以包含多个代理,如果每个代理都有返回值,那将只能返回最后
一个值所以事件拥有返回值就失去了它的意义.
3.委托的命名是事件名加事件处理程序(被委托代理的方法)
事件接受两个传入参数,一律命名为sender与e.
例如:public delegate void EventNameEventHandler(object sender,EventNameEventArgs e);
4.参数e的类型可以为EventArgs类
e的类型还可以自己声明一个类,而这个类是从
从System.EventArgs派生而来,如果我们的事件要传输
一个或多个参数,这个时候就可以从System.EventArgs派生
一个类把这些参数全部打包在这个类里面,当然这个类也有命名
规范:事件名加上事件参数(EventNameEventArgs)进行命名
5.如果事件不需要传递任何数据,也要声明两参数,e参数可以直接使用
系统提供的System.EventArgs类.如果需要传递数据,则要从System.Eventargs
继承一个类,并把数据放到里面.
命名规范示例:
public delegate void EventNameEventHandler(object sender,EventArgs e);
public event EventNameEventHandler EventName
6.在引发事件的类中提供一个受保护的方法,以OnEventName进行命名.
在该方法中引发该事件
例如:
//声名为虚方法,可以给它的子类重写.
protected virtual void OnEventName(EventArgs e)
{
/*为什么要用临时变量来操作事件呢?
这样做主要是为了防止存在线程同步问题.
*/
EventHandler handler=Event;
if(EventName!=null)
{
EventName(this,e);
}
}
根据.net规范编写委托事件示例:
/// <summary> /// 按照.net规范,事件有一个或多个参数 ///需要从System.EventArgs派生出 ///一个类把这些参数全部打包在这个类里面, /// </summary> public class PubEventArgs { /*readonly关键字的作用是,当给定义readonly的变量赋值后 就不能在改变这个变量的值(只读的)*/ //杂志名称 private readonly string magazineName; public string MagazineName { get { return magazineName; } } //出版时间 private readonly DateTime publishDate; public DateTime PublishDate { get { return publishDate; } } public PubEventArgs(string magazineName, DateTime publishDate) { this.magazineName = magazineName; this.publishDate = publishDate; } } /// <summary> /// 事件发行者(出版社) /// </summary> public class Publich { /*按照.net规范声明事件所需的代理(委托名称为:事件名+EventHandler) * 参数:无参数的情况下可以定义为:delegate void PubComputerEventHandler(object sender,System.EventArgs e); * 以下定义的PubEventArgs类型是继承自System.EventArgs的一个类,把定义的参数放在里面. */ public delegate void PubComputerEventHandler(object sender, PubEventArgs e); public delegate void PubLiftEventHandler(object sender, PubEventArgs e); //声明事件 public event PubComputerEventHandler PubComputer; public event PubLiftEventHandler PubLift; /*定义触发事件的方法按照规范 * 它的访问修饰符为protected * 并且是可被子类重写的 * 命名为事件名前加上一个On */ protected virtual void OnPubComputer(PubEventArgs e) { /*为什么要用临时变量来操作事件呢? 这样做主要是为了防止存在线程同步问题. */ PubComputerEventHandler handler = PubComputer; if (handler != null) { //触发事件 handler(this, e); } } protected virtual void OnPubLift(PubEventArgs e) { PubLiftEventHandler handler = PubLift; if (handler != null) { PubLift(this, e); } } //调用触发事件的方法的方法 public void issueComputer(String magezineName, DateTime publishDate) { Console.WriteLine("发行了" + magezineName); OnPubComputer(new PubEventArgs(magezineName, publishDate)); } public void issueList(String magezineName, DateTime publishDate) { Console.WriteLine("发行了" + magezineName); OnPubLift(new PubEventArgs(magezineName, publishDate)); } } /// <summary> ///事件订阅者 /// </summary> public class Subscriber { private string name; public Subscriber(string name) { this.name = name; } //事件处理程序 public void Receive(object sender, PubEventArgs e) { Console.WriteLine(e.PublishDate + " " + name + "收到了" + e.MagazineName); } } public class Client { public static void Main(String[] args) { //创建一个出版社 Publich publish = new Publich(); //创建一个事件订阅者:张三 Subscriber zs = new Subscriber("张三"); //创建一个事件订阅者:李四 Subscriber ls = new Subscriber("李四"); //张三订阅了电脑杂志,当事件触发时将引发代理的zs.Receive方法 publish.PubComputer += new Publich.PubComputerEventHandler(zs.Receive); //李四订阅了电脑杂志,当事件触发时将引发代理的ls.Receive方法 publish.PubComputer += new Publich.PubComputerEventHandler(ls.Receive); //李四订阅了生活杂志,当事件触发时将引发代理的ls.Receive方法 publish.PubLift += new Publich.PubLiftEventHandler(ls.Receive); //引发事件 publish.issueComputer("电脑杂志", Convert.ToDateTime("2008-1-1 10:30:00")); publish.issueList("生活杂志", Convert.ToDateTime("2008-1-1 10:30:00")); Console.WriteLine("一年后..................."); Console.WriteLine("-------------------------"); //李四退订了电脑杂志 publish.PubComputer -= new Publich.PubComputerEventHandler(ls.Receive); publish.issueComputer("电脑杂志", Convert.ToDateTime("2009-1-1 10:30:00")); publish.issueList("生活杂志", Convert.ToDateTime("2009-1-1 10:30:00")); Console.ReadKey(); } }
发表评论
-
向SqlCommand对象的ParameterCollections集合添加参数时犯的低级错误
2009-10-23 16:58 1512今天写代码遇到了一个小小的问题看来是基础不过关啊,嘿嘿. ... -
数字金额转为大写金额
2009-10-21 16:46 1269方法一: /// <summary> ... -
格式化文件大小的C#方法
2009-10-21 10:31 1812/// <summary> // ... -
学习C#:Attribute与Property
2009-10-04 14:23 2779一.什么是Attribute 先看下面的三段代码: ... -
String和StringBuilder的区别和使用
2009-08-11 10:22 1276String是固定不变的,在进行字符串连接的时候是新建一 ... -
C#值类型后面加问号表示可为空null(Nullable 结构)
2009-08-04 14:38 7981值类型后面加问号表示可为空null(Nullable 结构)N ... -
C# 替换去除HTML标记方法(正则表达式)
2009-07-31 11:02 8640using System.Text.RegularExpres ... -
C#里面比较时间大小三种方法
2009-07-29 12:55 12231。比较时间大小的实验 string str1 ... -
DataTime.Ticks
2009-07-29 07:30 4503java Date.getTime() getTime pub ... -
.net读取和写入txt文件
2009-07-21 23:34 7353//检查文件,如果文件不 ... -
Static方法
2009-07-19 23:28 8571.static方法是类中的一个成员方法,属于整个类,即使不用 ... -
C#中判断空字符串的3种方法性能分析
2009-07-02 08:47 12403种方法分别是: string a="&qu ... -
ASP.NET发布网站解决方案
2009-06-30 14:31 5360对于想了解发布网站那 ... -
C#中@的用法
2009-06-28 06:13 8681. 加在字符串前面,字符串中的 \ 失去转义符的作用,直接 ... -
c# cs 生成dll
2009-06-25 23:00 2360C# 语言是一种简单但功 ... -
C#项目引用完全相同dll文件的问题解决方法(反射)
2009-06-25 19:52 7216今天有开发人员问我一个问题,他的项目中要引用两个类库,这两 ... -
ADO.NET事务
2009-06-23 14:07 981private void DemoTranscation() ... -
null,"",String.Empty的区别
2009-06-16 16:37 11801.null null 关键字是表示不引用任何对象的空引用 ... -
C#类和接口、虚方法和抽象方法及值类型和引用类型的区别
2009-06-13 14:56 10971.C#类和接口的区别 ... -
Asp.net日期格式
2009-06-06 18:37 1286DateTime dt = DateTime.Now; ...
相关推荐
总结一下,`委托与事件`是.NET编程中不可或缺的部分,它们允许我们创建回调机制,处理异步操作,并实现解耦的设计。在`PrintDemo1`示例中,我们看到如何定义委托,创建事件,以及如何订阅和触发事件。通过深入学习和...
在这个“委托与事件的简单例子”中,我们可能会看到以下代码结构: 1. **定义委托**: 首先,我们需要定义一个委托类型,表示我们的事件处理方法签名。例如: ```csharp public delegate void ...
本文将深入探讨C#中的委托与事件,并通过实例来帮助理解它们的工作原理和使用场景。 首先,我们来了解什么是委托。在C#中,委托是一种类型安全的指针,它可以指向一个方法。换句话说,委托可以被视为能够存储方法的...
此外,关于委托和事件的中间代码,也就是编译器在编译时生成的与委托和事件相关的IL代码,同样需要深入理解。中间代码涉及到方法指针、调用约定、闭包等概念,它们是理解.NET运行时如何实际执行委托和事件操作的关键...
C# 委托与事件的概念及理解 委托是 C# 中一个非常重要的概念,它可以看作是一个函数指针,能够引用对象方法,通过传递地址的机制完成。委托是一个类,当你对它实例化时,要提供一个对象方法,将其作为它构造函数的...
在本节“VS2010轻松学习C# - 从零到深入 - 天轰穿.NET4趣味编程视频教程_第25讲:委托与事件实例浅析”中,我们将深入探讨C#编程中的两个核心概念:委托(Delegates)和事件(Events)。这两个概念在.NET框架中扮演...
### C#中的委托与事件关系解析 #### 一、引言 在面向对象编程语言C#中,委托(Delegate)和事件(Event)是两个重要的概念。本文将深入探讨这两者之间的关系及其在实际开发中的应用。 #### 二、委托(Delegate) ...
C#中的委托与事件讲透读书笔记学习心得 在C#中,委托和事件是两个非常重要的概念,它们在.NET Framework中的应用非常广泛。然而,对于很多初学者来说,理解委托和事件并不是一件容易的事情。它们就像是一道槛儿,过...
在C#编程语言中,委托和事件是两个非常重要的概念,它们构成了事件驱动编程的基础。...在实际项目中,结合文档《C#委托与事件.doc》的详细分析,初学者将更好地掌握这些概念,并能够在实践中得心应手。
委托和事件是C#编程语言中的重要特性,它们在实现对象间的通信和解耦中扮演着关键角色。本文将深入探讨这两个概念,并通过一个具体的示例来解释...通过理解和熟练掌握委托与事件,开发者可以写出更高效、更灵活的代码。
在本章"CH10 委托与事件"中,我们将深入探讨这两种机制,以及如何在C#编程中有效地利用它们。 首先,让我们了解一下**委托**。委托可以被看作是“类型安全”的函数指针,它允许我们存储对方法的引用,并可以在稍后...
### C#中的委托与事件详解 #### 一、引言 在.NET Framework中,委托与事件是非常重要的概念,尤其对于那些需要实现回调机制的应用场景来说更是如此。虽然这些概念对于初学者来说可能有些抽象和难以理解,但一旦...
委托类型必须与指定的方法签名匹配。例如,我们可以定义一个处理数字相加的委托,然后将两个加法方法绑定到这个委托,以便在适当的时候调用它们。 2. **事件定义**:事件是类的一种特殊类型的委托,用于在对象之间...
本文将深入探讨委托与事件的基本概念,以及如何在实际开发中运用它们。 **一、委托(Delegates)** 1. **定义**:委托在.NET中是一种类型,它封装了对方法的引用。换句话说,委托可以看作是函数指针的高级版本,...
在C#编程语言中,委托和事件是两个关键的概念,它们是实现面向对象设计模式,尤其是事件驱动编程的基础。本文将深入探讨这两个概念,并通过实际的代码示例...希望这些实例代码能帮助你更好地掌握和应用C#的委托与事件。
【C#委托与事件详解】 委托是C#中一种强大的特性,它允许我们将方法作为参数传递,这在处理事件和回调机制中尤为重要。在.NET Framework中,委托是类的实例,它封装了一个或多个方法,使得我们可以像操作对象一样...