D-21 委派 ? delegate ? Action ? Linq

物件导向之後呢

小光跟着大头从最基础的基本语法学习到方法以及物件导向,那接下来要怎麽让开发的速度更快更便捷呢,所以大家就接下来看看本篇文章吧。

本文同步放置於此

委派 delegate

「前辈,除了物件导向之外还有甚麽方法可以让开发速度变快的阿。」
小光一早就兴冲冲的跑来跟大头请教关於开发的方法,但是大头今天似乎桌上的需求文件堆得异常的高,不过大头过了几分钟後就抬起头来回应小光的问题。
「其实除了物件导向之外还有另外一个函式语言程序设计的方法,他的做法更简单不会处理到物件之间的关系,所以有另一个面向的加快开发速度的方法。」
听到又有新的东西可以学让小光的眼睛一整个亮了起来,看到小光的表情後大头继续慢慢的说下去。
「这个函式语言程序设计的概念跟昨天学的物件导向的概念不同的地方是在函式内没有状态与资料的概念,所以对於处理方法时只有输入跟输出而已,而且输入的内容相同时输出的内容也会一致。」
讲到了这边,大头拿个水杯喝了一大口水,并接着继续讲下去。
「提到C#对於函式语言程序设计的开发方式就不能不提到C#的委派了,所以接下来我先说明一下如何使用委派。」

delegate

昨天提到的ReferenceType除了class之外还有另一个就是delegate,所谓的delegate简单说明就是宣告一个特定输入的参数以及返还的结果,然後接下来用这个delegate宣告的变数就可以承接与此delegate签章相符以及返还值相同的方法,并且在方法中使用,所以实际的例子可以看以下范例。

// 宣告一个委派
public delegate void DoSomethingDelegate(string message);

// 实作
public void Print(string message)
{
    Console.WriteLine(message);
}

// 宣告个变数放实作的方法
DoSomethingDelegate handler = Print;

// 呼叫执行该变数
handler("Hello World!"); 

好的,上述例子就是简单的委派宣告到使用,除了可以如此使用之外刚刚提到委派是个ReferenceType的变数,因此他也可以当作一个变数传到方法内,所以大家再看看下列例子。

// 接续上面例子
public void Add(int a, int b, DoSomethingDelegate handle)
{
    handle($"result: {a + b}");
}

虽然委派好用不过要先宣告一个型别很麻烦而且很累赘,所以在後续又有Action、func、Predicate的产生,所以接下来依序说明。

Action

Action其实只是简化委派的写法而已,因为对委派来说Action只是不须特别宣告只要透过泛型方法来定义输入参数,而且没有返还值的delegate,接下来来看一下Action的范例。

public void Add(int a, int b, Action<string> handle)
{
    handle($"result: {a + b}");
}

不过问题来了,如果说还需要返还值的delegate该怎麽办呢,请看下列Func

Func

看完Action如果说我们的方法需要一个返还值该如何处理呢,这时候就需要Func出马了,先说明一下FuncAction不同的是其泛型的最後一个参数是返还值,所以接下来我们看看Func的例子。

public int Add(int a, int b)
{
    return a + b;
}

public int Operator(int a, int b, Func<int, int, int> handle)
{
    return handle(a, b);
}

public void DoSomeThing()
{
    var a = 1;
    var b = 2;
    var c = Operator(a, b, Add);
}

好了,到这边关於delegate已经说明的差不多了,接下来说明一个弱化版的delegate

Predicate

接下来要说明的是Predicate,这个是输入一个参数然後只有一个返还的布林值,所以先看看下列的范例。

public void Check(int a, Predicate<int> handle)
{
    if (handle(a))
    {
        // Do someting
    }
}

相信大家看到这个范例一定会觉得这Predicate好难用,不过其实这个最常用,只是大家都没有发现到,晚一点的时候在跟大家说明。所以除了上述的delegate之外接下来会说明匿名的delegate

Lambda

前面都说明完delegate的功用,剩下的只是如何宣告的差别而已了,接下来要说明的就是匿名的delegate的写法,请大家看一下下列范例。

// Lambda (intput) => function
Func<int, int, int> multi = (a, b) => a * b;
var a = 2;
var b = 3;
var c = multi(a, b);

看到这里读者们应该会觉得奇怪为什麽要提到Lambda,他跟delegate好像没关系,因为接下来要说明一个跟delegate没有直接关系但是会很常用到的东西。

Linq

「前辈我常常听到Linq,究竟这个是什麽。」
在听完大头介绍完Lambda所提到的东西引起小光的注意。
「Linq我同常都会拿维基百科的语言整合查询来说明,举个例子就是说将SQL的表达式用在C#的资料结构上,不过我们习惯的是写API的写法而不是SQL语法,可以参考一下Linq的说明。」
听完大头这样说明小光一副似懂非懂的样子,所以大头就在补充说明。
「试着想看看如果说你要在整数序列中找到大於10的整数,你是不是脑袋中浮现foreach
小光听到大头的题目後思考了一下就点点头表示同意,看到小光同意的表现大头继续说下去。
「不过除了foreach的方式还有下面的写法让你参考一下。」

var list = new List<int> {1,12,39,58,76,1,3,7};
var moreThanTen = list.Where(x => x > 10);

「哇,这样写真的好简洁啊」
看到小光钦佩的眼神大头得意的点点头并接续说下去。
「刚刚Where中接的参数就是刚刚说到的Predicate,然後方法的部分则是刚刚讲的Lambda,所以是不是刚刚说的都用到了。」

後记

「前辈,我头又开始晕了」
在说明完delegateLinq之後小光对大头这麽说。
「没关系,头晕是正常的,因为我也曾经晕过,不过这个你会常常练习到所以不用怕。」
所以小光的这一天就在委派跟Linq度过了。


<<:  Dungeon Mizarka 012

>>:  Day10 获取摄影机及麦克风的访问权限

#9 CSS3 Flexbox: main style setting

What is Flexbox? Flexbox = Flexible Box "CSS3...

就先在这边帮他上了一个主题了 Day1

今天是自己开始铁人赛的第一天,目标其实很简单,想要把之前学到的,之前没学到的 全部整合整理成一个作品...

Day28 - Rails Resource 和 Model 入门

LINE Developers:https://developers.line.biz/zh-ha...

我们的基因体时代-AI, Data和生物资讯 Day12-基因疗法中之腺病毒载体与机器学习

上一篇我们的基因体时代-AI, Data和生物资讯 Day11-基因疗法中之腺病毒载体与机器学习 我...

Day 22 - 谈谈我对Android的兴趣

Day 22 - 谈谈我对Android的兴趣 认识Android 小时候我拿到我第一台手机,那时我...