SlideShare una empresa de Scribd logo
1 de 46
Descargar para leer sin conexión
Delegate (委派)
from C# 1.0 to C# 3.0
Wayne, Jonathan
2013.05.27
What is a Delegate?
一個語言機制,供我們可以建立一種
特殊性質的變數
var X 3
0x3344
Age=3
Name="Bill"
var Y
Value Type
Reference Type
var Z
MyFunc1()
MyFunc2()
Invocation
List
Delegate Instance
這種變數指向的是「方法的參考」
其實您已經在使用 Delegate...
對以下的程式是否覺得熟悉?
Delegate 分為兩部份:
1. Delegate type
2. Delegate instance
Delegate Type 宣告
delegate bool Validation (int id, double sum);
delegate
關鍵字
delegate 參照的
方法的回傳型別
delegate type
名稱
delegate 參照的方
法的參數列表
最典型的 Delegate 寫法
2. 宣告滿足 Delegate Type
要求的函式
1. 宣告 Delegate Type
3. 建立 Delegate Instance
4. 叫用 Delegate Instance
Delegate 從 C# 1.0 ~ 3.0
語法上的演進
C# 版本 新特性
1.0
2.0 匿名方法
(Anonymous Method)
3.0 Lambda Expression
Delegate coding style - C# 1.0
2. 宣告滿足 Delegate Type
要求的函式
1. 宣告 Delegate Type
3. 建立 Delegate Instance
4. 叫用 Delegate Instance
Delegate coding style - C# 1.0 (Cont.)
Instance Method 也可以
Invoke() 方法可以省略
Practice!
請問以下用法是對的嗎?
請問以下用法是對的嗎?
Recap
■ delegate 與其他常見變數上的差異
■ 使用 delegate 的 4 步驟
1.0 語法上的缺點?
太過囉嗦!
Delegate 在 C# 2.0 語法上的改變 -
Anonymous Method
Anonymous Method 宣告
delegate ( 參數列 ) {
方法主體
};
delegate
關鍵字
方法的回傳值型別由
Compiler 推論
Delegate coding style - C# 2.0
原始的 2, 3 步驟,使用一行即完成
Delegate coding style - C# 2.0
原始的 2, 3 步驟,使用一行即完成
1.0 的寫法
Anonymous Method 帶來的新語言
特性 - Closure (閉包)
Closure 允許匿名方法存取外部變數
Closure 範例
形成一個 Closure
2.0 vs. 1.0
■ 引入 Anonymous Method (匿名方法)
■ 引入了 Closure (閉包) 機制
Delegate 在 C# 3.0 語法上的改變 -
Lambda Expression
Lambda Expression
- 概念取自於程式語言理論中的
"Lambda Calculus"
Lambda Calculus 寫法
λx → x * x
λx.λy → x * y
C# 下的 Lambda Expression 寫法
(參數1, 參數2, ...) => <單行運算式>
x => x * x
(x, y) => x * y
(參數1, 參數2, ...) => {多行運算式}
Delegate coding style - C# 3.0
2、3步驟簡化為使用 Lambda Expression
Delegate coding style - C# 3.0
2、3步驟簡化為使用 Lambda Expression
從 Anonymous Method 到
Lambda Expression 的推衍
寫法轉換為 Lambda Expression
單行 Statement 可省略大括號
參數型別可由 Compiler 推論
單一參數不需括號
3.0 vs. 2.0
■ 引入 Lambda Expression
■ 更加重了型別推論 (Type Inference)的使用
Recap
■ C# 在 delegate 語法上的演進
■ Anonymous Method 與 Closure
■ Lambda Expression 與型別推論
TWO more things...
C# Event (事件)
Delegate 是事件的基礎
.Net 內建與事件相關的 Delegate -
EventHandler
使用 event 關鍵字宣告事件
使用事件
Delegate in LINQ
List<T>.Exists()
內建泛型 Delegate
Delegate 完整宣告
List<T>.Where()
Delegate 完整宣告
內建泛型 Delegate
Recap
■ Event 與 delegate 的關係
■ Delegate 在 LINQ 中的使用
Reference
MSDN 參考資料
■ delegate (C# 參考)
■ event (C# 參考)
■ 委派 (C# 程式設計手冊)
■ 事件 (C# 程式設計手冊)
■ 匿名函式 (C# 程式設計手冊)
■ ASP.NET Page Life Cycle Overview
書籍參考資料
■ Learning C# 3.0: Master the fundamentals of C# 3.0 - Delegates and
Events
■ C# 3.0 Cookbook, Third Edition: More than 250 solutions for C# 3.0
programmers - Delegates, Events, and Lambda Expressions
■ C# 4.0 in a Nutshell - Chapter 04 Advanced C#
Reference (Cont.)
論壇、Blog 文章
■ Huan-Lin 學習筆記 - C# 筆記:重訪委派-從 C# 1.0 到 2.0 到 3.0
■ Huan-Lin 學習筆記 - C# 筆記:從 Lambda 表示式到 LINQ
■ In 91 - [.NET]快快樂樂學LINQ系列前哨戰-Lambda的簡介
■ 老赵点滴 - 追求编程之美 - 从.NET中委托写法的演变谈开去(上):委托与匿
名方法
■ 老赵点滴 - 追求编程之美 - 从.NET中委托写法的演变谈开去(中):Lambda
表达式及其优势
■ 老赵点滴 - 追求编程之美 - 从.NET中委托写法的演变谈开去(下):性能相关
■ 老赵点滴 - 追求编程之美 - 警惕匿名方法造成的变量共享
■ 老赵点滴 - 追求编程之美 - 您善于使用匿名函数吗?
■ InfoQ 中文 - 高阶函数、委托与匿名方法
■ Stack Overflow 討論 delegate 是否為 reference type 的討論串 - Why are
delegates reference types?

Más contenido relacionado

Similar a Delegate (委派) Introduction

C#语言的演化
C#语言的演化C#语言的演化
C#语言的演化TerabyteX
 
Introduction to C++ over CLI
Introduction to C++ over CLIIntroduction to C++ over CLI
Introduction to C++ over CLI建興 王
 
My visual basic入門指引 5
My visual basic入門指引 5My visual basic入門指引 5
My visual basic入門指引 5Xavier Chou
 
TypeScript 開發實戰:開發即時互動的 html5 websocket 聊天室應用程式
TypeScript 開發實戰:開發即時互動的 html5 websocket 聊天室應用程式TypeScript 開發實戰:開發即時互動的 html5 websocket 聊天室應用程式
TypeScript 開發實戰:開發即時互動的 html5 websocket 聊天室應用程式Will Huang
 

Similar a Delegate (委派) Introduction (10)

C#语言的演化
C#语言的演化C#语言的演化
C#语言的演化
 
Dev307
Dev307Dev307
Dev307
 
Borland C++Builder 進階課程
Borland C++Builder 進階課程Borland C++Builder 進階課程
Borland C++Builder 進階課程
 
Introduction to C++ over CLI
Introduction to C++ over CLIIntroduction to C++ over CLI
Introduction to C++ over CLI
 
Borland C++Builder 入門課程
Borland C++Builder 入門課程Borland C++Builder 入門課程
Borland C++Builder 入門課程
 
My visual basic入門指引 5
My visual basic入門指引 5My visual basic入門指引 5
My visual basic入門指引 5
 
Python基本資料運算
Python基本資料運算Python基本資料運算
Python基本資料運算
 
Inside VCL
Inside VCLInside VCL
Inside VCL
 
TypeScript 開發實戰:開發即時互動的 html5 websocket 聊天室應用程式
TypeScript 開發實戰:開發即時互動的 html5 websocket 聊天室應用程式TypeScript 開發實戰:開發即時互動的 html5 websocket 聊天室應用程式
TypeScript 開發實戰:開發即時互動的 html5 websocket 聊天室應用程式
 
第1章 概论
第1章 概论第1章 概论
第1章 概论
 

Delegate (委派) Introduction