你的位置:首页 > ASP.net教程

[ASP.net教程]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(ShowOne());      FuncTwo = new Func<string, string>(ShowTwo);      Console.WriteLine(ShowTwo("Func ShowTwo"));      Console.ReadKey();    }    static string ShowOne()    {      return "Func ShowOne\n";    }    static string ShowTwo(string data)    {      return data;    }

 大家试着自己输出吧  毕竟程序还是要多练的哦