您的位置:首页 > 编程语言 > C#

看陈广老师c#参考视频总结(第六篇)

2008-07-24 18:50 453 查看
日期:2008-6-11
学习内容:委托
遗留问题:今天的内容比较模糊,需要进一步理解
学习总结:
1. 委托
知识点一:委托声明定义了一种类型,它用一组特定的参数以及返回类型来封装方法。对于静态方法,委托对象封装要调用的方法。对于实例方法,委托对象同时封装一个实例和该实例的一个方法。如果您有一个委托对象和一组适当的参数,则可以用这些参数调用该委托。
知识点二:委托本质是一个类(可以通过查看IL代码证实),他是C++中函数指针的替代品;C++中函数的指针只能指向静态的方法,而在C#中也能指向实例对象。
使用委托的代码实例:
[align=left]using System;[/align]
[align=left]delegate void eatMydelegate(string food);[/align]
[align=left]class Mydelegate[/align]
[align=left]{[/align]
[align=left] static void zsEat(string food)[/align]
[align=left] {[/align]
[align=left] Console.WriteLine("张三吃"+food);[/align]
[align=left] }[/align]
[align=left] static void lsEat(string food)[/align]
[align=left] {[/align]
[align=left] Console.WriteLine("李四吃"+food);[/align]
[align=left] }[/align]
[align=left] static void wwEat(string food)[/align]
[align=left] {[/align]
[align=left] Console.WriteLine("王五吃"+food);[/align]
[align=left] }[/align]
[align=left] static void Main()[/align]
[align=left] {[/align]
[align=left] eatMydelegate zs=new eatMydelegate(zsEat);[/align]
[align=left] eatMydelegate ls=new eatMydelegate(lsEat);[/align]
[align=left] eatMydelegate ww=new eatMydelegate(wwEat);[/align]
[align=left] zs("西瓜");[/align]
[align=left] ls("西瓜");[/align]
[align=left] ww("西瓜");[/align]
[align=left] [/align]
[align=left] }[/align]
}
上述代码中三个委托调用同一个参数(西瓜),过于繁琐有没有什么解决办法呢?委托链的引入
[align=left]using System;[/align]
[align=left]delegate void eatMydelegate(string food);[/align]
[align=left]class Mydelegate[/align]
[align=left]{[/align]
[align=left] static void zsEat(string food)[/align]
[align=left] {[/align]
[align=left] Console.WriteLine("张三吃"+food);[/align]
[align=left] }[/align]
[align=left] static void lsEat(string food)[/align]
[align=left] {[/align]
[align=left] Console.WriteLine("李四吃"+food);[/align]
[align=left] }[/align]
[align=left] static void wwEat(string food)[/align]
[align=left] {[/align]
[align=left] Console.WriteLine("王五吃"+food);[/align]
[align=left] }[/align]
[align=left] static void Main()[/align]
[align=left] {[/align]
[align=left] eatMydelegate zs=new eatMydelegate(zsEat);[/align]
[align=left] eatMydelegate ls=new eatMydelegate(lsEat);[/align]
[align=left] eatMydelegate ww=new eatMydelegate(wwEat);[/align]
[align=left] eatMydelegate eatChain;//定义委托连[/align]
[align=left] Console.WriteLine("张三,李四,王五,开座谈会");[/align]
[align=left] eatChain = zs + ls + ww;[/align]
[align=left] eatChain("西瓜");//给委托链赋参数[/align]
[align=left] Console.WriteLine("李四出去接电话");[/align]
[align=left] eatChain -= ls;//c#重载了+=和-=运算符,因此可以创建可变的委托链[/align]
[align=left] eatChain("香蕉");[/align]
[align=left] Console.WriteLine("李四回来了");[/align]
[align=left] eatChain += ls;[/align]
[align=left] eatChain("橘子");[/align]
[align=left] }[/align]
}
用.net framework2.0引入的新特性,匿名方法,来简化上面的代码
[align=left]using System;[/align]
[align=left]delegate void eatMydelegate(string food);[/align]
[align=left]class Mydelegate[/align]
[align=left]{[/align]
[align=left] static void Main()[/align]
[align=left] {[/align]
[align=left] eatMydelegate eatChain;[/align]
[align=left] eatChain = null;[/align]
[align=left] eatChain += delegate(string food) { Console.WriteLine("张三吃" + food); };//.net framework2.0引入的新特性[/align]
[align=left] eatChain += delegate(string food) { Console.WriteLine("李四吃" + food); };[/align]
[align=left] eatChain += delegate(string food) { Console.WriteLine("王五吃" + food); };[/align]
[align=left] eatChain("香蕉");[/align]
[align=left] }[/align]
[align=left]}[/align]
动态方法代理:
[align=left]using System;[/align]
[align=left]delegate void eatMydelegate(string food);[/align]
[align=left]class Man[/align]
[align=left]{[/align]
[align=left] private string name;[/align]
[align=left] public Man(string name)[/align]
[align=left] {[/align]
[align=left] this.name = name;[/align]
[align=left] }[/align]
[align=left] public void eat(string food)[/align]
[align=left] {[/align]
[align=left] Console.WriteLine(name + "吃" + food);[/align]
[align=left] }[/align]
[align=left]}[/align]
[align=left]class Party[/align]
[align=left]{[/align]
[align=left] static void eatTogerther(string food, params eatMydelegate[] values)[/align]
[align=left] {[/align]
[align=left] if (values == null)[/align]
[align=left] {[/align]
[align=left] Console.WriteLine("座谈会结束");[/align]
[align=left] }[/align]
[align=left] else[/align]
[align=left] {[/align]
[align=left] eatMydelegate eatChain = null;[/align]
[align=left] foreach (eatMydelegate ed in values)[/align]
[align=left] eatChain += ed;[/align]
[align=left] eatChain(food);[/align]
[align=left] Console.WriteLine();[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] static void Main()[/align]
[align=left] {[/align]
[align=left] Man ZS = new Man("张三");[/align]
[align=left] Man LS = new Man("李四");[/align]
[align=left] Man WW = new Man("王五");[/align]
[align=left] eatMydelegate zs = new eatMydelegate(ZS.eat);[/align]
[align=left] eatMydelegate ls = new eatMydelegate(LS.eat);[/align]
[align=left] eatMydelegate ww = new eatMydelegate(WW.eat);[/align]
[align=left] Console.WriteLine("张三,李四,王五,开座谈会");[/align]
[align=left] eatTogerther("西瓜",zs,ls,ww);[/align]
[align=left] Console.WriteLine("李四出去接电话");[/align]
[align=left] eatTogerther("香蕉",zs,ww);[/align]
[align=left] Console.WriteLine("李四回来了");[/align]
[align=left] eatTogerther("橘子",zs,ls,ww);[/align]
[align=left] eatTogerther(null,null);[/align]
[align=left] }[/align]
[align=left]}[/align]
本文出自 “无名鼠辈” 博客,请务必保留此出处http://xiaoshu838.blog.51cto.com/433568/89444
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: