SlideShare a Scribd company logo
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?

More Related Content

PDF
Generic Delegate
PDF
Deferred Execution (延遲執行)
PDF
建置Python開發環境
PPT
Coding guideline
PPTX
Intro to C++ Basic
PDF
Java注解详解
PPT
1.1 konsep sistem
PPTX
Delegates and events
Generic Delegate
Deferred Execution (延遲執行)
建置Python開發環境
Coding guideline
Intro to C++ Basic
Java注解详解
1.1 konsep sistem
Delegates and events
Ad

Delegate (委派) Introduction