c# 之委託 匿名函式 lamada表示式
阿新 • • 發佈:2019-02-11
委託:
why use 委託?
先給你一個需求,有一個字串陣列 List<string> li=new List<string>() {“abc” ,“DEf”,"HALDFJdfaf"}
要求將這三個字串分別轉換成大寫,小寫,和這三個字串前後都加上雙引號。
正常情況先我們需要宣告三個方法來實現這個需求:
public static void strToUpper(List list){
for (int i= 0,i<list.count(),i++){
list[i]=list[i].ToUpper();
}
}
public static void strToLower(List list){
for (int i= 0,i<list.count(),i++){
list[i]=list[i].ToLower();
}
}
public static void strToLower(List list){
for (int i= 0,i<list.count(),i++){
list[i]="/"" + list[i]+"/"";
}
}
三個方法定義完成,但是你會發現我們的程式碼重複率其實很高,只是方法的第三行略有變化
這個時候我們想能否用一個方法就可以實現這個的功能呢?
委託:
基本定義:
委託所指向的函式必須和委託具有相同的簽名(引數和返回值)
宣告一個委託函式:注意寫的位置是在名稱空間下而不是類中
關鍵字 :delegate
eg: public delegate void DelSayHi(String name);
有點像定義介面中的方法,沒有實現。 但是意義完全不同,因為是在類外部,
我們相當於自己定義了一個DelSyaHi 的型別。
public static void test(string name,DelSayHi del){
//這個del就是我們需要傳入的方法
del(string name)
}
問題來了?委託是建立好了,但是我如何將委託與對應的方法進行繫結?
在關係到我在呼叫test()方法的時候,如何傳入具體的方法。
DelSayHi del =方法名 (不是字串)
賦值了一下
說明函式可以轉換成委託型別。
直接呼叫即可 test(“jake”,方法名)
到這一步委託的好處依然沒有體現,你會覺得這真他媽的麻煩我還不如直接呼叫舒服呢。
使用匿名函式配合使用一下
既然是一個委託: DelSysHi del 型別
不要去自定義方法,而是把方法直接賦給我們定義的委託
//關鍵字別忘啦!!!!
DelSayHi del = delegate(string name){consle.writelin("hello"+name);};
呼叫 del(“jake”);
還有一種更加簡化的方法 私用lamada表示式
DelSayHi del=(string name) => {consle.writelin("hello"+name);}
lamada表示式: 最簡單的的寫法: n => n>4
n是隨便定義的,意思是拿到一個大於4的引數
比如說我要刪除一個數組中大於4的所有元素
list.RemoveAll(n=> n>4)
why use 委託?
先給你一個需求,有一個字串陣列 List<string> li=new List<string>() {“abc” ,“DEf”,"HALDFJdfaf"}
要求將這三個字串分別轉換成大寫,小寫,和這三個字串前後都加上雙引號。
正常情況先我們需要宣告三個方法來實現這個需求:
public static void strToUpper(List list){
for (int i= 0,i<list.count(),i++){
list[i]=list[i].ToUpper();
}
}
public static void strToLower(List list){
for (int i= 0,i<list.count(),i++){
list[i]=list[i].ToLower();
}
}
public static void strToLower(List list){
for (int i= 0,i<list.count(),i++){
list[i]="/"" + list[i]+"/"";
}
}
三個方法定義完成,但是你會發現我們的程式碼重複率其實很高,只是方法的第三行略有變化
這個時候我們想能否用一個方法就可以實現這個的功能呢?
委託:
基本定義:
委託所指向的函式必須和委託具有相同的簽名(引數和返回值)
宣告一個委託函式:注意寫的位置是在名稱空間下而不是類中
關鍵字 :delegate
eg: public delegate void DelSayHi(String name);
有點像定義介面中的方法,沒有實現。 但是意義完全不同,因為是在類外部,
我們相當於自己定義了一個DelSyaHi 的型別。
public static void test(string name,DelSayHi del){
//這個del就是我們需要傳入的方法
del(string name)
}
問題來了?委託是建立好了,但是我如何將委託與對應的方法進行繫結?
在關係到我在呼叫test()方法的時候,如何傳入具體的方法。
DelSayHi del =方法名 (不是字串)
賦值了一下
說明函式可以轉換成委託型別。
直接呼叫即可 test(“jake”,方法名)
到這一步委託的好處依然沒有體現,你會覺得這真他媽的麻煩我還不如直接呼叫舒服呢。
使用匿名函式配合使用一下
既然是一個委託: DelSysHi del 型別
不要去自定義方法,而是把方法直接賦給我們定義的委託
//關鍵字別忘啦!!!!
DelSayHi del = delegate(string name){consle.writelin("hello"+name);};
呼叫 del(“jake”);
還有一種更加簡化的方法 私用lamada表示式
DelSayHi del=(string name) => {consle.writelin("hello"+name);}
lamada表示式: 最簡單的的寫法: n => n>4
n是隨便定義的,意思是拿到一個大於4的引數
比如說我要刪除一個數組中大於4的所有元素
list.RemoveAll(n=> n>4)