C#基础知识六之委托(delegate、Action、Func、predicate)
1. 什么是委托
官方解释
委托是定义方法签名的类型,当实例化委托时,您可以将其实例化与任何具有兼容签名的方法想关联,可以通过委托实例调用方法。
个人理解
委托通俗一点说就是把一件事情交给别人来帮助完成,而在C#中也可这样理解为委托就是动态调用方法。委托就是一个类,它定义了一个类,使得可以将方法当做另一个方法参数传递,这种将方法动态的赋给参数的做法,可以避免我们在程序中使用大量的 If-Else语句,同时使得程序具有更好的可拓展性。
2. delegate
Delegate至少0个参数,至多32个参数,可以是无返回值,也可以指定有返回值。
委托(delegate)语法定义如下:
public delegate int CalculatorAdd(int x,int y);
定义一个委托基本上就是定义了一个新类,所以可以在类的任何地方定义委托,即可以在类的内部定义,也可以在任何类的外部定义,还可以在命名空间中把委托定义为最顶层对象。在委托定义上添加一般的访问修饰符:public、private、protected等。
完成一个委托的四步骤:
- 声明一个委托。
- 声明一个方法对应委托。
- 方法来实例化委托。
- 调用委托。
代码如下:
class Program
{ // 1. 定义一个委托
public delegate int CalculatorAdd(int x, int y); // 2. 声明一个方法对应委托
public static int Add(int x, int y)
{
return x + y;
}
static void Main()
{
// 3. 方法实例化委托
CalculatorAdd AddCacu = new CalculatorAdd(Add); // 4. 调用委托
int s = AddCacu(, ); Console.Write(s); Console.ReadLine();
}
}
3. Action
使用此委托以参数形式传递方法,不必显式定义一个封装无参数过程的委托。
Action是无返回值的泛型委托。
Action<int,string> 表示传入参数int,string类型,无返回值的委托。
Action<int,string,bool> 表示传入参数int,string,bool类型,无返回值的委托。
Action<int,int,int,int> 表示有传入4个int型参数,无返回值的委托。
Action至少0个参数,至多16个参数,无返回值。
代码如下:
static void Main()
{
Action<string> action = new Action<string>(WriterMessage);
action("你好,我是Action委托");
Console.ReadLine();
}
private static void WriterMessage(string message)
{
Console.WriteLine(message + "\n");
}
匿名方法:
static void Main()
{
Action<string> say = delegate(string message)
{
Console.Write(message);
};
say("Hello Word");
Console.ReadLine();
}
Lambda表达式:
static void Main()
{
Action<string> say = message => Console.WriteLine(message);
say("Hello Word");
Console.ReadLine();
}
private static void WriterMessage(string message)
{
Console.WriteLine(message + "\n");
}
4. Func
Func是有返回值的泛型委托。
Func<int> 表示无参数,返回为int类型的委托。
Fun<object,string,int> 表示传入object、string参数,返回int类型的委托。
Func<T1,T2,,T3,int> 表示传入T1、T2、T3参数,返回int类型的委托。
Func至少O个参数,最多16个参数,根据返回值泛型返回。必须要有返回值,不能void。
匿名方法:
static void Main()
{
Func<string, string> say = delegate(string message)
{
return message;
};
string saymessage = say("Hello World");
Console.WriteLine(saymessage);
Console.ReadLine();
}
private static string WriterMessage(string message)
{
return message;
}
Lambda表达式
static void Main()
{
Func<string, string> say = (massage) => massage;
Console.WriteLine(say("HelloWord"));
Console.ReadLine();
}
5. predicate
表示定义一组条件并确定指定对象是否符合这些条件的方法。predicate主要用于Array和List的几种方法使用,用于搜索集合中的元素。
匿名方法:
static void Main()
{ List<int> list = new List<int> { , , , , , , , , };
Predicate<int> pre = delegate(int num)
{
return num > ? true : false;
}; List<int> all = list.FindAll(pre);
foreach (int i in all)
{
Console.WriteLine(i);
}
Console.ReadLine();
}
Lambda表达式:
static void Main()
{ List<int> list = new List<int> { , , , , , , , , };
Predicate<int> pre = x => x > ? true : false;
List<int> all = list.FindAll(pre);
foreach (int i in all)
{
Console.WriteLine(i);
}
Console.ReadLine();
}
参考资料:http://www.cnblogs.com/akwwl/p/3232679.html
C#基础知识六之委托(delegate、Action、Func、predicate)的更多相关文章
- C# 委托应用总结(委托,Delegate,Action,Func,predicate)
C# 委托应用总结 一.什么是委托 1.1官方解释 委托是一种定义方法签名的类型.当实例化委托时,您可以将其实例与任何具有兼容签名的方法相关联.您可以通过委托实例调用方法. 1.2个人理解 委托就是执 ...
- 委托delegate,Action,Func,Predicate
C#委托的介绍(delegate.Action.Func.predicate) 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递.事件是一种特殊的委托. 1.委托的声明 ...
- 【Unity|C#】基础篇(11)——内置的泛型委托(Action/Func/Predicate)
[Action] 无返回值 的泛型委托,可以有0~16个参数(函数重载) public delegate void Action(); // 无参数 public delegate void Acti ...
- Delegate,Action,Func,Predicate的使用与区别
C#4.0推出后,类似Linq,Lamda表达式等许多新的程序写法层次不穷.与之相关的Delegate,Action,Func,Predicate的使用和区别也常常让大家迷惑,此处就结合实际的应用,对 ...
- (C#) Action, Func, Predicate 等泛型委托
(转载网络文章) (1). delegate delegate我们常用到的一种声明 Delegate至少0个参数,至多32个参数,可以无返回值,也可以指定返回值类型. 例:public del ...
- Delegate,Action,Func,匿名方法,匿名委托,事件 (转载)
Delegate,Action,Func,匿名方法,匿名委托,事件 (转载) 一.委托Delegate 一般的方法(Method)中,我们的参数总是string,int,DateTime...这些基本 ...
- python基础知识六 文件的基本操作+菜中菜
基础知识六 文件操作 open():打开 file:文件的位置(路径) mode:操作文件模式 encoding:文件编码方式 f :文件句柄 f = open("1.t ...
- Python基础知识(六)------小数据池,集合,深浅拷贝
Python基础知识(六)------小数据池,集合,深浅拷贝 一丶小数据池 什么是小数据池: 小数据池就是python中一种提高效率的方式,固定数据类型使用同一个内存地址 代码块 : 一个文 ...
- c# Action,Func,Predicate委托
System命名空间下已经预先定义好了三中泛型委托,Action,Func和Predicate,这样我们在编程的时候,就不必要自己去定义这些委托了 Action是没有返回值的 Func是带返回值的 不 ...
随机推荐
- Android性能优化之巧用软引用与弱引用优化内存使用
前言: 从事Android开发的同学都知道移动设备的内存使用是非常敏感的话题,今天我们来看下如何使用软引用与弱引用来优化内存使用.下面来理解几个概念. 1.StrongReference(强引用) 强 ...
- ZKWeb网页框架1.2正式发布
发行日志 https://github.com/zkweb-framework/ZKWeb/blob/master/ReleaseNotes/ReleaseNote.1.2.md 主要改动 更新 ZK ...
- Asp.net Core准备工作
1.安装环境 安装.Net Core SDK 安装VS2015 Update3 安装DotNetCore.1.0.1-VS2015Tools.Preview2.0.2.exe 2.新建Core工程 项 ...
- 趣说游戏AI开发:曼哈顿街角的A*算法
0x00 前言 请叫我标题党!请叫我标题党!请叫我标题党!因为下面的文字既不发生在美国曼哈顿,也不是一个讲述美国梦的故事.相反,这可能只是一篇没有那么枯燥的关于算法的文章.A星算法,这个在游戏寻路开发 ...
- 深入.NET平台和C#编程总结大全
对于初学者的你,等到你把这个看完之后就更清楚地认知.NET和C#编程了,好了废话不多说,开始吧! ...
- 创建ABPboilerplate模版项目
本文是根据角落的白板报的<通过ABPboilerplate模版创建项目>一文的学习总结,感谢原文作者角落的白板报. 1 准备 开发环境: Visual Studio 2015 update ...
- SpringMVC+Shiro权限管理【转】
1.权限的简单描述 2.实例表结构及内容及POJO 3.Shiro-pom.xml 4.Shiro-web.xml 5.Shiro-MyShiro-权限认证,登录认证层 6.Shiro-applica ...
- mysql 远程访问权限
MySQL默认没有开启远程访问的权限,需要手动打开,步骤如下: 1.通过命令行登录2.mysql>update user set host = '%' where user = 'root';这 ...
- charles工具抓包教程(http跟https)
1.下载charles 可以去charles官网下载,下载地址:http://www.charlesproxy.com/download/ 根据自己的操作系统下载对应的版本,然后进行安装,然后打 ...
- Membership三步曲之入门篇 - Membership基础示例
Membership 三步曲之入门篇 - Membership基础示例 Membership三步曲之入门篇 - Membership基础示例 Membership三步曲之进阶篇 - 深入剖析Pro ...