1. 什么是委托

官方解释

委托是定义方法签名的类型,当实例化委托时,您可以将其实例化与任何具有兼容签名的方法想关联,可以通过委托实例调用方法。

个人理解

委托通俗一点说就是把一件事情交给别人来帮助完成,而在C#中也可这样理解为委托就是动态调用方法。委托就是一个类,它定义了一个类,使得可以将方法当做另一个方法参数传递,这种将方法动态的赋给参数的做法,可以避免我们在程序中使用大量的 If-Else语句,同时使得程序具有更好的可拓展性。

2. delegate

Delegate至少0个参数,至多32个参数,可以是无返回值,也可以指定有返回值。

委托(delegate)语法定义如下:

public delegate int CalculatorAdd(int x,int y);

定义一个委托基本上就是定义了一个新类,所以可以在类的任何地方定义委托,即可以在类的内部定义,也可以在任何类的外部定义,还可以在命名空间中把委托定义为最顶层对象。在委托定义上添加一般的访问修饰符:public、private、protected等。

完成一个委托的四步骤:

  1. 声明一个委托。
  2. 声明一个方法对应委托。
  3. 方法来实例化委托。
  4. 调用委托。

代码如下:

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)的更多相关文章

  1. C# 委托应用总结(委托,Delegate,Action,Func,predicate)

    C# 委托应用总结 一.什么是委托 1.1官方解释 委托是一种定义方法签名的类型.当实例化委托时,您可以将其实例与任何具有兼容签名的方法相关联.您可以通过委托实例调用方法. 1.2个人理解 委托就是执 ...

  2. 委托delegate,Action,Func,Predicate

    C#委托的介绍(delegate.Action.Func.predicate) 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递.事件是一种特殊的委托. 1.委托的声明 ...

  3. 【Unity|C#】基础篇(11)——内置的泛型委托(Action/Func/Predicate)

    [Action] 无返回值 的泛型委托,可以有0~16个参数(函数重载) public delegate void Action(); // 无参数 public delegate void Acti ...

  4. Delegate,Action,Func,Predicate的使用与区别

    C#4.0推出后,类似Linq,Lamda表达式等许多新的程序写法层次不穷.与之相关的Delegate,Action,Func,Predicate的使用和区别也常常让大家迷惑,此处就结合实际的应用,对 ...

  5. (C#) Action, Func, Predicate 等泛型委托

    (转载网络文章) (1). delegate delegate我们常用到的一种声明   Delegate至少0个参数,至多32个参数,可以无返回值,也可以指定返回值类型.   例:public del ...

  6. Delegate,Action,Func,匿名方法,匿名委托,事件 (转载)

    Delegate,Action,Func,匿名方法,匿名委托,事件 (转载) 一.委托Delegate 一般的方法(Method)中,我们的参数总是string,int,DateTime...这些基本 ...

  7. python基础知识六 文件的基本操作+菜中菜

    基础知识六 文件操作 ​ open():打开 ​ file:文件的位置(路径) ​ mode:操作文件模式 ​ encoding:文件编码方式 ​ f :文件句柄 f = open("1.t ...

  8. Python基础知识(六)------小数据池,集合,深浅拷贝

    Python基础知识(六)------小数据池,集合,深浅拷贝 一丶小数据池 什么是小数据池: ​ 小数据池就是python中一种提高效率的方式,固定数据类型使用同一个内存地址 代码块 : ​ 一个文 ...

  9. c# Action,Func,Predicate委托

    System命名空间下已经预先定义好了三中泛型委托,Action,Func和Predicate,这样我们在编程的时候,就不必要自己去定义这些委托了 Action是没有返回值的 Func是带返回值的 不 ...

随机推荐

  1. 神马玩意,EntityFramework Core 1.1又更新了?走,赶紧去围观

    前言 哦,不搞SQL了么,当然会继续,周末会继续更新,估计写完还得几十篇,但是我会坚持把SQL更新完毕,绝不会烂尾,后续很长一段时间没更新的话,不要想我,那说明我是学习新的技能去了,那就是学习英语,本 ...

  2. javascript工厂模式和构造函数模式创建对象

    一.工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程(本书后面还将讨论其他设计模式及其在JavaScript 中的实现).考虑到在ECMAScript 中无法创 ...

  3. XML技术之DOM4J解析器

    由于DOM技术的解析,存在很多缺陷,比如内存溢出,解析速度慢等问题,所以就出现了DOM4J解析技术,DOM4J技术的出现大大改进了DOM解析技术的缺陷. 使用DOM4J技术解析XML文件的步骤? pu ...

  4. Android Notification 详解(一)——基本操作

    Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...

  5. PHP与JAVA构造函数的区别

    早期的PHP是没有面向对象功能的,但是随着PHP发展,从PHP4开始,也加入了面向对象.PHP的面向对象语法是从JAVA演化而来,很多地方类似,但是又发展出自己的特色.以构造函数来说,PHP4中与类同 ...

  6. 从啥也不会到可以胜任最基本的JavaWeb工作,推荐给新人的学习路线(二)

    在上一节中,主要阐述了JavaScript方面的学习路线.先列举一下我朋友的经历,他去过培训机构,说是4个月后月薪过万,虽然他现在还未达到这个指标. 培训机构一般的套路是这样:先教JavaSE,什么都 ...

  7. 多线程同步工具——Lock

    本文原创,转载请注明出处. 参考文章: <"JUC锁"03之 公平锁(一)> <"JUC锁"03之 公平锁(二)> 锁分独占锁与共享锁, ...

  8. maven依赖查询地址

    http://search.maven.org/#search%7Cga%7C1%7C

  9. GSD_WeiXin(高仿微信)应用源码

    高仿微信计划:已经实现功能 1.微信首页(cell侧滑编辑.下拉眼睛动画.下拉拍短视频.点击进入聊天详情界面) 2.通讯录(联系人字母排序.搜索界面) 3.发现(朋友圈) 4.我(界面) 待实现功能( ...

  10. BZOJ 3110: [Zjoi2013]K大数查询 [树套树]

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 6050  Solved: 2007[Submit][Sta ...