C#委托,事件,匿名委托
作为一个初学者,写下来是当做自己的学习笔记,希望在以后遇到问题的时候能够快速的找到方法
如果能帮助跟我一样的新人是更好不过的了 如果有什么不正确或者可以改进的地方也希望大家能够指出来 谢谢大家
1.委托
来百度一下什么是委托:委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。(百度百科)
先来写个简单的委托:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication2 { class Program { //声明没有参数,没有返回值的委托 public delegate void MyDelegate(); //委托对象 static MyDelegate myDelegate; public static void Show() { Console.WriteLine("我的代理"); } static void Main(string[] args) { myDelegate = new MyDelegate(Show);//实例化委托 委托myDelegate去做Show的事情 myDelegate();//调用myDelegate Console.ReadKey(); } } }
将上面的改为带参数,带返回值的委托
class Program { //声明带参数,带返回值的委托 public delegate string MyDelegate(string data); //委托对象 static MyDelegate myDelegate; public static string Show(string data) { return data; } static void Main(string[] args) { myDelegate = new MyDelegate(Show);//实例化委托 委托myDelegate去做Show的事情 Console.WriteLine(myDelegate("委托的参数"));//在调用时,需要带上参数 Console.ReadKey(); } }
现在我们写两个方法
class Program { //声明带参数,带返回值的委托 public delegate void MyDelegate(); //委托对象 static MyDelegate myDelegate; public static void ShowOne() { Console.WriteLine("委托一号"); } public static void ShowTwo() { Console.WriteLine("委托二号"); } }
我们现在想输出两个中的一个 可以改成这样 顺便复习一下带参数的委托
class Program { //声明带参数的委托 public delegate void MyDelegate(string data); //委托对象 static MyDelegate myDelegate; public static void Show(string data) { switch (data) { case "委托一号": Console.WriteLine("委托一号"); break; case "委托二号": Console.WriteLine("委托二号"); break; } } static void Main(string[] args) { myDelegate = new MyDelegate(Show); myDelegate("委托一号");//调用时的参数是什么就会输出对应的委托了 Console.ReadKey(); } }
什么委托一号 什么委托二号 这个好记 要是选项多了 东西又不太好记怎么办 稍微改进一下
/// <summary> /// 1是委托一号 2是委托二号 /// </summary> enum DATA { zero, NumOne, NumTwo, }; class Program { //声明带参数的委托 public delegate void MyDelegate(DATA data); //委托对象 static MyDelegate myDelegate; public static void Show(DATA data) { switch (data) { case DATA.NumOne: Console.WriteLine("委托一号"); break; case DATA.NumTwo: Console.WriteLine("委托二号"); break; } } static void Main(string[] args) { myDelegate = new MyDelegate(Show); myDelegate(DATA.NumTwo); Console.ReadKey(); } }
是不是瞬间感觉高大上了 还有要活用/// <summary> /// </summary> 这可是好东西 可以让别人用你代码的时候更加的清楚用的是什么有什么用处 可以提高代码的可读性哦
2.事件
如果我们希望两个方法同时输出该怎么做呢 应该这样:
class Program { //声明带参数,带返回值的委托 public delegate void MyDelegate(); //委托对象 static event MyDelegate myDelegate;//此处与上面不同哦 public static void ShowOne() { Console.WriteLine("委托一号"); } public static void ShowTwo() { Console.WriteLine("委托二号"); } static void Main(string[] args) { myDelegate = new MyDelegate(ShowOne);//先给你对象赋上一个方法 myDelegate += new MyDelegate(ShowTwo);//再给你加上一个方法 myDelegate();//调用 Console.ReadKey(); } }
看下输出 调用一个 两个同时都显示出来了 没错这就是事件(event)
事件可以加 那能不能减呢 聪明 你没有猜错 当然可以 改完后看下结果
static void Main(string[] args) { myDelegate = new MyDelegate(ShowOne);//先给你对象赋上一个方法 myDelegate += new MyDelegate(ShowTwo);//再给你加上一个方法 myDelegate();//调用 Console.WriteLine("__________________________我来分割________________________"); myDelegate -= new MyDelegate(ShowOne); myDelegate();//减完后再调一次 Console.ReadKey(); }
3.匿名方法
委托和事件说完了 来看看特别一点的 匿名方法
在之前 每次实例化委托的时候都要有一个已经写好的方法 而匿名方法则不需要
class Program { //声明带参数的委托 public delegate void MyDelegate(string data); //委托对象 static MyDelegate myDelegate; static void Main(string[] args) { myDelegate = delegate(string data) //带参数 { Console.WriteLine(data); }; myDelegate("带参数的匿名方法"); Console.ReadKey(); } }
不带参数的只要将参数去掉即可 delegate后面跟上你需要用的参数在{}中进行你需要的操作 最后不要忘记带上分号哦
4.Lambda表达式
要是匿名方法还不够快 那试试这个
class Program { //声明带参数的委托 public delegate void MyDelegate(string data); //委托对象 static MyDelegate myDelegate; static void Main(string[] args) { myDelegate = (string data) => { Console.WriteLine(data); }; myDelegate("带参数Lambda表达式"); Console.ReadKey(); } }
代码量是不是更少了呢 直接用小括号写上参数,然后是=> 再用个{}来框住你的操作 同样最后也有分号
5.Action
先来看看它的解释
参数可以有好多也可以没有 但是 他没有返回值 来看看怎么用吧
class Program { //不带参数的Action static Action actionOne; //带参数的Action static Action<string> actionTwo; static void Main(string[] args) { actionOne = new Action(ShowOne); actionOne(); actionTwo = new Action<string>(ShowTwo); actionTwo("Action ShowTwo"); Console.ReadKey(); } static void ShowOne() { Console.WriteLine("Action ShowOne\n"); } static void ShowTwo(string data) { Console.WriteLine(data); } }
试着输出一下吧
6.Func
它与Action类似 但是他是必须带返回值的
前面的都是它的参数, 最后一个参数就是他的返回值
//不带参数的Action static Func<string> FuncOne; //带参数的Action static Func<string,string> FuncTwo; static void Main(string[] args) { FuncOne = new Func<string>(ShowOne); Console.WriteLine(FuncOne()); FuncTwo = new Func<string, string>(ShowTwo); Console.WriteLine(FuncTwo("Func ShowTwo")); Console.ReadKey(); } static string ShowOne() { return "Func ShowOne\n"; } static string ShowTwo(string data) { return data; }
大家试着自己输出吧 毕竟程序还是要多练的哦