博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#基础知识六之委托(delegate、Action、Func、predicate)
阅读量:5847 次
发布时间:2019-06-18

本文共 3969 字,大约阅读时间需要 13 分钟。

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(8, 9);            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
action = new Action
(WriterMessage); action("你好,我是Action委托"); Console.ReadLine(); } private static void WriterMessage(string message) { Console.WriteLine(message + "\n"); }

匿名方法:

static void Main()        {            Action
say = delegate(string message) { Console.Write(message); }; say("Hello Word"); Console.ReadLine(); }

 Lambda表达式:

static void Main()        {            Action
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
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
say = (massage) => massage; Console.WriteLine(say("HelloWord")); Console.ReadLine(); }

5. predicate

表示定义一组条件并确定指定对象是否符合这些条件的方法。predicate主要用于Array和List的几种方法使用,用于搜索集合中的元素。

匿名方法:

static void Main()        {            List
list = new List
{ 6, 90, 24, 17, 29, 27, 64, 33, 72 }; Predicate
pre = delegate(int num) { return num > 30 ? true : false; }; List
all = list.FindAll(pre); foreach (int i in all) { Console.WriteLine(i); } Console.ReadLine(); }

Lambda表达式:

static void Main()        {            List
list = new List
{ 6, 90, 24, 17, 29, 27, 64, 33, 72 }; Predicate
pre = x => x > 30 ? true : false; List
all = list.FindAll(pre); foreach (int i in all) { Console.WriteLine(i); } Console.ReadLine(); }

参考资料:http://www.cnblogs.com/akwwl/p/3232679.html

转载于:https://www.cnblogs.com/liujie2272/p/5441989.html

你可能感兴趣的文章
RedHat 5.6_x86_64 + ASM + RAW+ Oracle 10g RAC (二)
查看>>
win7不能全屏
查看>>
MySQL/InnoDB的并发插入Concurrent Insert
查看>>
产品经理有话说——产品汪成长记(入职)
查看>>
2016/01
查看>>
从魔兽世界到激战2看MMO网游角色成长
查看>>
转两好文防丢:Debian 版本升级/降级 & Linux 应用程序失去输入焦点问题的解决...
查看>>
linux学习入门之Linux系统目录结构
查看>>
码农们:完美主义也是一种错
查看>>
HDU - Pseudoforest
查看>>
Nexus杂
查看>>
Android --- GreenDao的实现(ORM框架)
查看>>
用Java发起HTTP请求与获取状态码(含状态码列表)
查看>>
微信内下载APK 微信浏览器apk下载的解决方案
查看>>
js_coding
查看>>
Linux平台Java调用so库-JNI使用例子
查看>>
PCM数据格式,多少字节算一帧
查看>>
Spring Data JPA
查看>>
Selenium中的xpath定位
查看>>
KACK的处理方法
查看>>