C# 匿名委派 + Lambda + Func 建國科技大學 資管系 饒瑞佶.

Slides:



Advertisements
Similar presentations
第四章 类、对象和接口.
Advertisements

第三讲 面向对象(上).
3.2 Java的类 Java 类库的概念 语言规则——程序的书写规范 Java语言 类库——已有的有特定功能的Java程序模块
漫畫風雲.
我征服了黃山 林達的黃山之旅 2006春.
第4章 條件判斷與迴圈 Java 2 程式設計入門與應用.
四資二甲 第三週作業 物件導向程式設計.
C#程序设计案例教程 第3章 程 序 结 构.
第一章 C语言概述 计算机公共教学部.
第一章信託法 第一節 信託契約 第二節 信託財產 第三節 受益人 第四節 受託人 第五節 信託關係之消滅.
第4章 JavaScript脚本语言基础 4.1 JavaScript简介 4.2 JavaScript语法基础
设计模式可以帮助我们改善系统的设计,增强 系统的健壮性、可扩展性,为以后铺平道路。
第 5 章 流程控制 (一): 條件分支.
C#程序设计 10软件1、2班 王槐彬 计算机工程学院.
第二章 JAVA语言基础.
類別與物件 Class & Object.
《计算机网络技术》 asp.net 程序设计 文本类控件 笪静.
第三章 控制结构.
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
程式設計實作.
C++Primer 3rd edition 中文版 Chap 5
在 Web 应用中,导航是非常重要的。ASP
第10章 App微信分享的实现 倚动实验室.
CHAPTER 9 建構方法 ROBERT.
程式敘述執行順序的轉移 控制與重複、方法 Lecturer:曾學文.
本單元介紹何謂變數,及說明變數的宣告方式。
第14章 多线程和异步程序设计 14.1 多线程程序设计 14.2 异步程序设计.
程式設計實作.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
程序设计期末复习 黎金宁
委派與執行緒 建國科技大學 資管系 饒瑞佶.
C#面向对象程序设计 $7 继承和多态性.
實作輔導 3 日期: 4/14(星期六) 09:10~12:00、13:10~16:00
模板调整技巧.
快递单模板的制作.
視窗程式設計 (Windows Programming)
泛型委托 泛型接口、方法和委托.
Java程序设计 第2章 基本数据类型及操作.
第5讲 使用类和对象编程(三) 内部类 实例 程序控制结构 选择语句.
订单打印模板调整技巧.
第三章 C# 基础知识.
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
JAVA 编 程 技 术 主编 贾振华 2010年1月.
《JAVA程序设计》 语音答疑 辅导老师:高旻.
第二章Java基本程序设计.
普通高速模板的制作与调整.
第五章 介面/集合/泛型 注意: 本投影片僅供本書上課教師使用,非經同意請勿上網轉載或供拷貝.
补充:c#语言基础.
Chapter 2 基本語法.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
Java程式初體驗大綱 大綱 在學程式之前及本書常用名詞解釋 Hello Java!程式 在Dos下編譯、執行程式
第3章 JavaScript基本语句.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
第二章 Java语法基础.
订单汇总单功能详解 -芜花.
目标 流程控制 字符串处理 C# 的类和对象 C# 访问修饰符 C# 构造函数和析构函数.
挑戰C++程式語言 ──第9章 函數.
#include <iostream.h>
第四章 函数 丘志杰 电子科技大学 计算机学院 软件学院.
第二章 Java基本语法 讲师:复凡.
第1章 数据结构基础概论 本章主要介绍以下内容 数据结构研究的主要内容 数据结构中涉及的基本概念 算法的概念、描述方法以及评价标准.
JAVA 程式設計與資料結構 第三章 物件的設計.
第2章 Java语言基础.
MenuStrip by Szeto CY Visual C# 2008.
多重條件選擇敘述
C#快速導讀 流程控制.
本节内容 在堆中创建对象 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
第二章 Java基础语法 北京传智播客教育
第二章 Java基本语法 讲师:复凡.
Presentation transcript:

C# 匿名委派 + Lambda + Func 建國科技大學 資管系 饒瑞佶

委派delegate 圖片來源:https://dotblogs.com.tw/lastsecret/2010/06/26/16201

這與前面的FB、Lin,Twitter的範例相同 //建立一個委派 MyDelegate d; //依照傳入的動作,選擇要傳入委派的方法 switch (s) { case "+": d = new MyDelegate(加法); break; case "-": d = new MyDelegate(減法); case "*": d = new MyDelegate(乘法); case "/": d = new MyDelegate(除法); default: } //使用該委派 int Answer = d(5, 2); MessageBox.Show(Answer); 呼叫時產生MyDelegate物件 並傳入函數名稱 真正呼叫 這與前面的FB、Lin,Twitter的範例相同

匿名方法 匿名方法就是不需要為了可能只用一次的方法而建 立類別實體和該方法,直接經由delegate關鍵字將 方法傳入即可 例如: xxx.click( function(){…})

改寫前面黃色段落 switch (s) { case "+": d = delegate(int x, int y) return x + y; }; break; case "-": d = (int x, int y) => { return x - y; }; case "*": d = (int x,int y) => x * y; case "/": d = (x, y) => y != 0 ? x / y : 0; default: d = new MyDelegate(加法); }

code 匿名委派 非匿名

public delegate int MyDelegate(int x, int y); MyDelegate d; private void button1_Click(object sender, EventArgs e) { string s = "+"; switch (s) case "+": d = delegate (int x, int y) return x + y; }; break; case "-": d = (int x, int y) => { return x - y; }; case "*": d = (int x, int y) => x * y; case "/": d = (x, y) => y != 0 ? x / y : 0; default: d = new MyDelegate(other); } label1.Text = d(5, 2).ToString(); public delegate int MyDelegate(int x, int y); MyDelegate d; private int other(int x,int y) { return 0; }

4種匿名委派函數寫法 case "+": d = delegate (int x, int y) { return x + y; }; d = (int x, int y) => x * y; 3種Lambda運算式 case "-": d = (int x, int y) => { return x - y; }; case "/": d = (x, y) => y != 0 ? x / y : 0;

Lambda Lambda 運算式就是匿名委派的簡化版本 具名委派→匿名委派→ Lambda 運算式 Lambda 運算式 x => x * x 的意思是「x 移至 x 乘以 x」

單行Lambda (int x, string s) => s.Length > x; //明確指定傳入參數的型別,適用在無法型別推斷的時候 (a, b) => a + b; //讓編譯器使用型別推斷省去撰寫傳入參數型別的寫法 a => a * a; //只有一個傳入參數時,可以省略圓括號 () => "L" + "I" + "N" + "Q"; //沒有傳入參數時,必須用空的圓括號

多行Lambda  (input parameters) => {statement;}。這種寫法和匿名委派 相比較,其實就是把 delegate 關鍵字省略成 「=>」運算 子而已 (int x, string s) => {x = x * 2; return s.Length > x;} (a, b) => {a = a + b; return a * b;}

Func Func<>是可以存方法的變數 Func是微軟定義好的delegate 因此使用上與delegate一樣 圖片來源:https://dotblogs.com.tw/lastsecret/2010/06/26/16201

private void Form2_Load(object sender, EventArgs e) { string s = "+"; Func<int, int, int> f; // 依照輸入的運算符號選擇要存的方法 // Func<>是可以存方法的變數, // 所以+我存了一個Add的方法 // -是用delegate存匿名方法 // *、/ 是用lambda存方法 switch (s) case "+": f = Add; break; case "-": f = delegate (int x, int y) { return x - y; }; case "*": f = (int x, int y) => x * y; case "/": f = (x, y) => y != 0 ? x / y : 0; default: } //使用MyFunc方法 label1.Text = MyFunc(f, 5, 2).ToString(); // 也可以透過lambda方式傳入匿名的Func //label1.Text = MyFunc((x, y) => x + y, 5, 5).ToString();

這樣的做法還是為了以後的維護與擴充便利性 與之前談過的ToFB等委派相同 public int MyFunc(Func<int, int, int> fun, int x, int y) { return fun(x, y); } public static int Add(int x, int y) return (x + y); 這樣的做法還是為了以後的維護與擴充便利性 與之前談過的ToFB等委派相同