委托复习

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6
 7 namespace 委托复习
 8 {
 9     class Program
10     {
11         static void Main(string[] args)
12         {
13             //委托相当于一个指向函数的变量
14             //指向函数的类型由委托的类型决定------委托是一个类型
15             //MyDelegate s = M1;
16             //Console.WriteLine(s());//输出 1
17
18             //委托组合易犯的错误
19             //委托组合后,返回值为最后一个的值,前面被冲掉
20             MyDelegate s = new MyDelegate(M1) + M2;
21             Console.WriteLine(s());//输出 2
22
23             //错误相当于 int i=i+3;----此时i无值,等号右边不能是未知数
24             //string s1+=s();
25
26             Console.ReadKey();
27         }
28         public static string M1()
29         {
30             return "1";
31         }
32         public static string M2()
33         {
34             return "2";
35         }
36         delegate string MyDelegate();
37     }
38 }

委托实现事件:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Text;
 4 using System.Runtime.InteropServices;
 5 namespace MyDelegate
 6 {
 7     #region 委托实现事件
 8     //定义委托处理程序
 9     public delegate void PlayGameHandler(object sender, System.EventArgs e);
10     //员工,可能玩游戏的人
11     public class 员工
12     {
13         //先定义一个事件,这个事件表示“员工”在玩游戏
14         public event PlayGameHandler PlayGame;
15         //员工的称呼
16         private string m_Name;
17         //员工的工资
18         private int m_Money;
19         //构造函数
20         public 员工(string name)
21         {
22             Console.WriteLine("生成员工 " + name + "...");
23             m_Name = name;
24             m_Money = 1000;
25         }
26         //此属性得到员工的称呼
27         public string 称呼
28         { get { return m_Name; } }
29         //此属性可操作员工的工资
30         public int 钱
31         {
32             get { return m_Money; }
33             set { m_Money = value; }
34         }
35         //引发事件的“玩游戏”方法。为了引发PlayGame这个事件,必须指定此方法来引发它,其中包括 OnPlayGame(e)
36         public void 玩游戏()
37         {
38             Console.WriteLine(m_Name + "开始玩游戏了...");
39             Console.WriteLine(m_Name + ":CS好玩,哈哈哈!我玩...");
40             System.Threading.Thread.Sleep(500);
41             System.EventArgs e = new EventArgs();
42             OnPlayGame(e);
43         }
44         //实现OnPlayGame(e)
45         //protected virtual void OnPlayGame(System.EventArgs e)
46         protected void OnPlayGame(System.EventArgs e)
47         {
48             if (PlayGame != null)
49                 PlayGame(this, e);
50         }
51     }
52     //负责扣钱的人
53     public class 老板
54     {
55         //构造函数
56         public 老板()
57         {
58             Console.WriteLine("生成老板...");
59         }
60         public void 扣钱(object sender, EventArgs e)
61         {
62             Console.WriteLine("老板:好小子,上班时间胆敢玩游戏...");
63             Console.WriteLine("老板:看看你小子有多少钱...");
64             员工 f = (员工)sender;    /*这个代码表示让老板扣员工的钱,那么,老板扣钱的时候,必须要操作员工的对象实例。
65               参数object sender对象表示激发事件的对象,在这个程序里面就表示这个sender其实是员工*/
66             Console.WriteLine(f.称呼 + "的钱:" + f.钱.ToString());
67             Console.WriteLine("开始扣钱...");
68             System.Threading.Thread.Sleep(500);
69             f.钱 = f.钱 - 500;
70             Console.WriteLine("扣完了...现在" + f.称呼 + "还剩下:" + f.钱.ToString());
71         }
72     }
73     class Program
74     {
75         static void Main(string[] args)
76         {
77             Console.WriteLine("剧情开始了...");
78             老板 boss = new 老板(); //老板
79             员工 employee = new 员工("小张");   //员工小张
80             //指定监视,即设定发现小张玩游戏后采取的行动——扣钱
81             employee.PlayGame += new PlayGameHandler(boss.扣钱);
82             //小张开始玩游戏,浑然不知老板就在身后
83             employee.玩游戏();
84             //结果钱被扣掉,歇菜
85             Console.WriteLine("剧情结束...");
86             Console.ReadLine();
87         }
88     }
89
90     #endregion
91 }

委托复习,布布扣,bubuko.com

时间: 2024-12-29 07:06:37

委托复习的相关文章

随手复习一下委托:delegate

先骂个街,天儿太闷了…… 随手复习一下委托,delegate 是一种函数指针,是 .net 提供的一种安全的函数指针,翻译的也很贴切,像是委托人,又像代理人,通过“委托”来执行一些函数而不是直接调用它.因为 C# 中委托被实现为指针链表,所以委托可以加入多个函数,一次性一块儿执行. 举个花生:小明(中国教育中最频繁出镜的绝对明星,不知为什么,我脑子里直觉般闪现第一个名字就是它,我Kao)要给他妈买酱油(貌似这个例子在多年前我自己的帖子里出现过),妈妈对小明的调用就表示为: 1 public cl

面向对象——一起来复习委托与事件!

事件与委托其实并不难理解,只是因为它们的使用方式与常用的编码有很大的差别,例如通常编写的都是同步代码,调用一个类型的方法,会即刻出现方法执行的结果,这是符合逻辑的.但在某些情况中,同步代码未必满足需求,拿最近的打车软件打个比方,搭车者发送一个信息,就会推送给附近的司机,使用同步代码,搭车对象肯定需要调用司机中心对象,这样就出现了我们一直不愿意看到的情况:两个类型紧密地耦合在一起.既然要其它类型对自己的行为作出反应,亲自调用其类型的方法似乎不可避免,在同步代码中,很难避免这种紧密的类型调用关系.而

【C#复习总结】细说委托

1 前言 前几天看到博客园一个前辈写了一篇文章用“五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树”,文章写的非常好,推荐阅读一下,正所谓“前人栽树,后人乘凉”,在这我就站在巨人的肩上,再将这几个概念加上“事件”这一概念在复习一遍,一来是加深记忆,二来方便后来人学习,本人小白一枚,有错的地方希望老司机指正. 2 什么是委托 委托是一个类,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序

委托 (代码复习)

1 namespace DelegateDemo 2 { 3 //声明委托 4 public delegate void MyDel(); 5 //声明带参的委托 6 public delegate void MyDelAdd(int num1, int num2); 7 //声明带有返值的委托 8 public delegate string MyDelStrUp(string s); 9 10 //声明委托用于演示匿名方法 11 public delegate string ProcessS

C#中委托,匿名函数,lamda表达式复习

一.委托 1.就给类比较,类用class声明,委托用delegate声明. 2.委托要指向一个真正的方法. 3.委托的签名,要和指向的方法一样. //1.声明一个委托 public delegate void DelSayHi(string name); public static void SayHiChinese(string name) { Console.WriteLine("你好?" + name); } public static void SayHiEnglish(str

复习action委托

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication4 { public static class InvokeExt { //扩展方法进行装箱输出继承IEnumerable<T>的内容项 public static void ShowItems<T>

【C#复习总结】细说泛型委托

1 前言 本系列会将[委托] [匿名方法][Lambda表达式] [泛型委托] [表达式树] [事件]等基础知识总结一下.(本人小白一枚,有错误的地方希望大佬指正) 系类1:细说委托 系类2:细说匿名方法 系列3:细说Lambda表达式 系列4:细说泛型委托 系列5:细说表达式树 系列6:细说事件 还是用大佬的文章来震场吧,“随着.net版本的不升级,新版本总要区别于旧版本吧,不然微软的工程师怎么向他们的老大交差呀?所以微软又来玩新花样了.” 这次我们提前贴代码来体验一下泛型委托与一般委托和匿名

复习扩展方法 涉及委托,这里我使用自定义委托类型 public delegate bb MyFunc&lt;in T,out bb&gt; (T arg)

using System;using System.Collections.Generic;using System.Data;using System.Linq;using System.Text;using System.Threading.Tasks; namespace ConsoleApplication8{ public static class ListExt { public delegate bb MyFunc<in T, out bb>(T arg); public sta

委托和多播委托

刚刚学习了委托的内容,先来说一下自己对委托的理解,权当是复习吧: 委托可以定义在类里面,也可以定义在类外面,如果定义在类里面就只能被这个类调用,不论声明它是public 还是private.如果定义在类外面就能被所有类调用.如果程序是多线程的,委托方法希望能在UI层调用,那么可以在命名空间下定义. //委托的声明 delegate关键字,这个委托只能代表返回值是空.参数是一个string类型的一个方法public delegate void GreetingDelegate(string nam