首页 > 学院 > 开发设计 > 正文

C#中Action和Func的使用

2019-11-17 02:28:30
字体:
来源:转载
供稿:网友

C#中Action和Func的使用

在日常使用delegate时,我们通常需要显示声明一个名为XXX的委托,而在使用Action委托时,不必显示定义一个封装无参数过程的委托。

比如正常使用delegate:

 1 using System; 2  3 namespace MT 4 { 5     public delegate void ShowValue();//在这里显示声明一个委托 6  7     public class Test 8     { 9         //在这里有一个Test类,类中有一个void的方法,作用是输出一个字符串10         PRivate string instanceName;11         public Test(string name)12         {13             this.instanceName = name;14         }15         public void DisplayToConsole()16         {17             Console.WriteLine(this.instanceName);18         }19     }20 21     public class Program22     {23         //在Main函数里使用委托去调用这个方法24         static void Main(string[] args)25         {26             Test name = new Test("Sirius");27             ShowValue method = name.DisplayToConsole;28             method();29             Console.ReadKey();30         }31     }32 }

Action就是这么个姿势:

1 static void Main(string[] args)2 {3     Test name = new Test("Sirius");4     Action method = name.DisplayToConsole;5     method();6     Console.ReadKey();7 }

当然,Action也可以有签名模板,Action<T>。

public void DisplayToConsole(string name){      Console.WriteLine(name);}
Action<string> method2 = name.DisplayToConsole;method2("123");Console.ReadKey();

说到Func,其实跟Action的区别就是,Func代理的方法必须有返回值,因为Func的重载模式是Func<T1,T2....TResult>,T几代表代理的方法的模板,也就是可以传入的参数,TResult就是代理方法的返回值。

比如,我们把上面的DisplayToConsole方法稍作修改,改为DisplayForFunc:

1         public void DisplayForFunc(string name)2         {3             Console.WriteLine(name);4         }

这个时候使用Func委托时不行的

Func<string, object> f = t.DisplayForFunc;

会被告知返回类型错误,Func所适应的代理则应该是具有返回值类型的,我们再修改一下方法,让它返回一个无意义的bool值:

1         public bool DisplayForFunc(string name)2         {3             Console.WriteLine(name);4             return true;5         }
1         static void Main(string[] args)2         {3             Test t = new Test("Sirius");4             Func<string, bool> f = t.DisplayForFunc;5             f("123");6             Console.ReadKey();            7         }

这样就是可以的啦!

顺便贴一张MSDN的牛逼图,这是我第一次看MSDN看到想笑&hellip;…

代码参考:https://msdn.microsoft.com/zh-cn/library/system.action(v=vs.110).aspx


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表