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;
}
大家试着自己输出吧 毕竟程序还是要多练的哦

浙公网安备 33010602011771号