委托学习续:Action、Func和Predicate

我们先看一个上一章的委托的例子:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6
 7 namespace Test
 8 {
 9     class Program
10     {
11         static void Main(string[] args)
12         {
13             new Program();
14
15             Console.ReadKey();
16         }
17
18         public delegate void AddDelegate(float a, int b);
19
20         public Program()
21         {
22             AddDelegate add = addFunc;
23
24             add(11.11f, 123);
25         }
26
27         private void addFunc(float a, int b)
28         {
29             double c = a + b;
30             Console.WriteLine(c);
31         }
32     }
33 }

Action:

Action可以看做C#为我们提供的内置的没有返回值的委托,用在第一个例子里可以去掉委托的声明,代码如下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6
 7 namespace Test
 8 {
 9     class Program
10     {
11         static void Main(string[] args)
12         {
13             new Program();
14
15             Console.ReadKey();
16         }
17
18         public Program()
19         {
20             //指定好参数数量和类型即可立即使用, 无需显示的定义委托
21             Action<float, int> add = addFunc;
22
23             add(11.11f, 123);
24         }
25
26         private void addFunc(float a, int b)
27         {
28             double c = a + b;
29             Console.WriteLine(c);
30         }
31     }
32 }

同时,匿名函数和Lambda的写法也是允许的,详情可以查看上一篇笔记。

Func:

类似Action,Func是C#为我们提供的内置的具有返回值的委托,而返回值的类型为最后一个被指定的类型,请看下面的例子:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6
 7 namespace Test
 8 {
 9     class Program
10     {
11         static void Main(string[] args)
12         {
13             new Program();
14
15             Console.ReadKey();
16         }
17
18         public Program()
19         {
20             //指定好参数数量和类型即可立即使用, 无需显示的定义委托
21             //对于 Func 委托来说, 最后指定的类型为返回的类型
22             Func<float, int, string> add = addFunc;
23
24             string result = add(11.11f, 123);
25             Console.WriteLine(result);
26         }
27
28         private string addFunc(float a, int b)
29         {
30             double c = a + b;
31             Console.WriteLine(c);
32             return "hello: " + c.ToString();
33         }
34     }
35 }

Predicate:

该委托专门用于过滤集合中的元素,下面我们看一个例子,保留数组中的正整数:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6
 7 namespace Test
 8 {
 9     class Program
10     {
11         static void Main(string[] args)
12         {
13             new Program();
14
15             Console.ReadKey();
16         }
17
18         public Program()
19         {
20             //指定的类型为需要过滤的数组的元素类型
21             Predicate<int> filter;
22             filter = IntFilter;
23
24             int[] nums = new int[8]{12, -33, -89, 21, -15, 29, 40, -52};
25             //开始进行过滤, 返回 true 表示留下当前元素
26             int[] result = Array.FindAll(nums, filter);
27
28             for(int i = 0; i < result.Length; i++)
29             {
30                 Console.WriteLine(result[i]);
31             }
32         }
33
34         private bool IntFilter(int i)
35         {
36             if (i >= 0)
37             {
38                 return true;
39             }
40             return false;
41         }
42     }
43 }
时间: 2024-10-14 14:42:05

委托学习续:Action、Func和Predicate的相关文章

Lambda expressions , Action , Func and Predicate

http://www.tutorialsteacher.com/csharp/csharp-action-delegate lambda 表达式 Action,func lambda表达式是什么,其有什么优点,不使用lambda 其的目的:简化代码. 在JAVA当中一般是使用接口来实现 Action is also a delegate type defined in the System namespace. An Action type delegate is the same as Fun

C# 委托学习笔记

接触委托 代理 delegate很久啦.除了看API,Kotoba也给我讲了 .说到委托,拿下面这个小例子比较好.(14年6月26花花给我的练习) 实例:写一个方法A,定义个方法B(打印hello),和方法C(打印world),其中我只允许调用方法A.实现,1秒后打印出hello,3秒后打印出world. 先说一下回调的好处: 在开发中我们有些代码呢,是很固定的,但又有一些东西很灵活很容易发生变动.先假设B和C都不是我们自己写的,而是其他人已经写好的其他方法,所以我们在无BUG的情况下,尽可能不

委托学习(2)

1.1 委托链 委托是多路广播的,因此可以将两个或多个非委托实例组合到一起,构成委托链.所谓委托链就是被委托的的方法用链表的形式连接在一起. 关于委托链的形成在C#中使用二元+和+=运算符来来组合委托,使用-或-=运算符来从委托链中移除一个委托. 当组合连个委托或者从一个委托链中移除一个委托实例时,将产生一个新的委托.该委托有自己的调用列表,被组合或移除的委托的调用列表将保持不变. 如果一个委托实例的列表中包含多个方法,那么调用这样的委托实例时将会按照调用列表的顺序执行方法.如果参数含引用或输出

Struts2框架学习(二) Action

Struts2框架学习(二) Action Struts2框架中的Action类是一个单独的javabean对象.不像Struts1中还要去继承HttpServlet,耦合度减小了. 1,流程 拦截器拦截请求,创建代理Action对象,执行方法,返回结果,界面跳转. 拦截器解析请求路径,获取Action的名称,到配置文件中查找action的完整类名,利用反射创建对象. 每请求一次,就创建一个对象,所以action是多例的,也是线程安全的. 2,关系 请求的路径和配置文件的对应关系: 配置文件中包

Lambda Action Func练习

namespace lambda { delegate void TestDelegate(string s); class Program { static void Main(string[] args) { //动态构建C# Lambda表达式例子1 var ints = new int[10] {10,2,3,4,5,2,34,54,4,40}; var newints = ints.Where(i => i > 20); foreach (var a in newints) { Co

委托学习(3)

1.1 匿名方法 在上次我们提到,创建委托实例时都必须明确指定使用的方法.C# 2.0引入了匿名方法,及允许与委托相关联的的代码块以内联方式写入使用委托的位置,从而方便地将代码块直接"绑定"到委托实例.使用匿名方法就可以降代码块直接作为委托的参数,而不需要先定义方法,再将方法作为参数来创建委托.匿名方法还能够对包含它的函数成员的拒不状态进行共享访问,如果要使用具名方法来实现同样的状态共享,就需要将局部变量提升为一个辅助类的字段. 匿名方法由delegate,可选的参数表和包含{}内的代

委托学习(1)

1. 委托 1. 我们都知道指针在C/C++中的使用是非常灵活具有以下几个优点: a.为函数提供修改调用变元的灵活手段: b.支持C 动态分配子程序 c.可以改善某些子程序的效率 >>在数据传递时,如果数据块较大(比如说数据缓冲区或比较大的结构),这时就可以使用指针传递地址而不是实际数据,即提高传输速度,又节省大量内存. d.为动态数据结构(如二叉树.链表)提供支持 虽然C#不支持指针但是委托很好的解决了这个难题.鞋面是委托与指针的区别: a,函数指针事不安全的类型,而委托是完全面向对象和类型

C#委托的介绍(delegate、Action、Func、predicate)

委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递.事件是一种特殊的委托. 1.委托的声明 (1). delegate delegate我们常用到的一种声明   Delegate至少0个参数,至多32个参数,可以无返回值,也可以指定返回值类型.   例:public delegate int MethodtDelegate(int x, int y);表示有两个参数,并返回int型. (2). Action Action是无返回值的泛型委托. Action 表示无参,

C#委托(delegate、Action、Func、predicate)

委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递.事件是一种特殊的委托. 1.委托的声明 (1). delegate delegate我们常用到的一种声明   Delegate至少0个参数,至多32个参数,可以无返回值,也可以指定返回值类型.   例:public delegate int MethodtDelegate(int x, int y);表示有两个参数,并返回int型. (2). Action Action是无返回值的泛型委托. Action 表示无参,