Download presentation
Presentation is loading. Please wait.
1
C# 匿名委派 + Lambda + Func 建國科技大學 資管系 饒瑞佶
2
委派delegate 圖片來源:
3
這與前面的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的範例相同
4
匿名方法 匿名方法就是不需要為了可能只用一次的方法而建 立類別實體和該方法,直接經由delegate關鍵字將 方法傳入即可
例如: xxx.click( function(){…})
5
改寫前面黃色段落 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(加法); }
6
code 匿名委派 非匿名
7
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; }
8
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;
9
Lambda Lambda 運算式就是匿名委派的簡化版本 具名委派→匿名委派→ Lambda 運算式
Lambda 運算式 x => x * x 的意思是「x 移至 x 乘以 x」
10
單行Lambda (int x, string s) => s.Length > x; //明確指定傳入參數的型別,適用在無法型別推斷的時候 (a, b) => a + b; //讓編譯器使用型別推斷省去撰寫傳入參數型別的寫法 a => a * a; //只有一個傳入參數時,可以省略圓括號 () => "L" + "I" + "N" + "Q"; //沒有傳入參數時,必須用空的圓括號
11
多行Lambda (input parameters) => {statement;}。這種寫法和匿名委派 相比較,其實就是把 delegate 關鍵字省略成 「=>」運算 子而已 (int x, string s) => {x = x * 2; return s.Length > x;} (a, b) => {a = a + b; return a * b;}
12
Func Func<>是可以存方法的變數 Func是微軟定義好的delegate 因此使用上與delegate一樣
圖片來源:
13
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();
14
這樣的做法還是為了以後的維護與擴充便利性 與之前談過的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等委派相同
Similar presentations