首页 > 代码库 > 委托复习

委托复习

 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 Program10     {11         static void Main(string[] args)12         {13             //委托相当于一个指向函数的变量14             //指向函数的类型由委托的类型决定------委托是一个类型15             //MyDelegate s = M1;16             //Console.WriteLine(s());//输出 117 18             //委托组合易犯的错误19             //委托组合后,返回值为最后一个的值,前面被冲掉20             MyDelegate s = new MyDelegate(M1) + M2;21             Console.WriteLine(s());//输出 222 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 int31         {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 Program74     {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     #endregion91 }