首页 > 代码库 > 委托简单示例
委托简单示例
刚开始初学C#时,对委托和事件觉得太难懂了,最近看到网上有很多写关于这方面的例子,这里我就mark一下,按自己理解的记下来,权当记个笔记
一,委托
首先,我们定义一个委托,名字就随便取了,自己看的懂就行
public delegate int myDelegate(int x);
为了这个委托,咱写个返回值与参数与之相同的方法
public static int GetXXX(int x) { Console.WriteLine(x * 2); return x * 2; }
方法很简单,传进来的值乘以2再返回回去,看看委托是怎么调用的
myDelegate md = GetXXX; int x = md(3);
通过委托,我们能调用到GetXXX这个方法,有人说,直接调用GetXXX(3)方法不就成了吗,委托的作用在哪里?我们再来一个方法
public static int GetSSS(int x) { Console.WriteLine(x * 11); return x * 11; }
我们调用的时候,除了调用前面的GetXXX外,还可以调用继续调用GetSSS这个方法,这个就是所谓的多播委托。
myDelegate md = GetXXX; md += GetSSS; int x = md(3);
在这里用+=来实现了调用多个方法,同样,也可以用-=去掉某个方法。
委托的另外一个用法是可以把委托当作参数来传递
//创造一个方法,以委托为参数 public static int CalculateByD(int x, myDelegate d) { return d(x); } //把方法名GetXXX作为参数传递,之后又传递GetSSS实现这种插件式编程 CalculateByD(2, GetXXX); CalculateByD(2, GetSSS);
另外还有一种泛型委托,如果你对泛型了解,这种理解起来也不难
//泛型委托申明 public delegate T myDelegate2<T>(T x); //泛型委托事件 public static T Calculate2<T>(T x, myDelegate2<T> c) { return c(x); } //调用事件 myDelegate2<int> md2 = GetXXX; Calculate2(8, md2);
还有一种是匿名委托,也需要了解一下
//不指定特定方法调用委托 int y = Calculate2(8, x => x * 9);
Func 和 Action 委托
有了泛型委托,就有了一能适用于任何返回类型和任意参数(类型和合理的个数)的通用委托,Func 和 Action。如下所示(下面的in表示参数,out表示返回结果):
delegate TResult Func <out TResult> ();delegate TResult Func <in T, out TResult> (T arg);delegate TResult Func <in T1, in T2, out TResult> (T1 arg1, T2 arg2);... 一直到 T16delegate void Action ();delegate void Action <in T> (T arg);delegate void Action <in T1, in T2> (T1 arg1, T2 arg2);... 一直到 T16
有了这样的通用委托,我们上面的Calculator泛型委托就可以删掉了,示例就可以更简洁了:
public static void Calculate<T>(T[] values, Func<T,T> c) { for (int i = 0; i < values.Length; i++) values[i] = c(values[i]);}
Func 和 Action 委托,除了ref参数和out参数,基本上能适用于任何泛型委托的场景,非常好用。
委托简单示例
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。