1、控制項的invoke不能直接呼叫匿名委託,需要乙個methodinvoker物件
invoke定義原型:
public object invoke(delegate method);
public object invoke(delegate method, params object args);
methodinvoker定義原型:
public delegate void methodinvoker();
this.button1.invoke(new methodinvoker(delegate())); 或者
label1.invoke(new eventhandler(delegate(object o, eventargs e)
)); 2、委託
public delegate void statechangedeventhandle(bool isconnected);
public event statechangedeventhandle serverstatechanged;
2.1、匿名委託 / 匿名方法
c#為委託提供一種機制,可以為委託定義匿名方法,匿名方法沒有名稱,編譯器會定指定乙個名稱
匿名方法中不能使用跳轉語句跳轉到該匿名方法的外部,也不能跳轉到該方法的內部。
也不能在匿名方法外部使用的ref和out引數
//用匿名方法定義委託,匿名委託
class program
;//呼叫委託的匿名方法
console.writeline(my(" 引數 "));
//從結果可以看到,匿名方法同樣達到了為委託定義方法的效果
console.read();
}}
2.2、實名委託
private void form1_load(object sender, eventargs e)
private string fun(string param)
#region 委託的應用
//委託的定義
public delegate string delerate(string year);
//三個方法的定義,以供委託呼叫
public string year_2009(string s)
//三個方法的定義,以供委託呼叫
public string year_2008(string s)
//三個方法的定義,以供委託呼叫
public string year_2007(string s)
protected void button1_click(object sender, eventargs e)
//執行委託的過程,把引數 year2 傳入實際執行的方法中去
public static string getyear(delerate dr, string year2)
#endregion
3、predicate委託
predicate委託:表示定義一組條件並確定指定物件是否符合這些條件的方法。
下面的**示例使用帶有 array.find 方法的 predicate
委託搜尋 point 結構的陣列。
如果 x 和 y 欄位的產品大於 100,000,則該**所代表的方法 productgt10 將返回 true。
find 方法呼叫陣列的每個元素的**,從而在第乙個滿足測試條件的點停止。
非泛型類array使用predicate委託,實名委託
public class example
; point first = array.find(points, productgt10);
console.writeline("found: x = , y = ", first.x, first.y);
}// this method implements the test condition for the find
// method.
private static bool productgt10(point p)
else
}}/* this code example produces the following output:
found: x = 275, y = 395
*/
泛型類list使用 predicate委託,匿名委託
private void form1_load(object sender, eventargs e)
;listnewlst = lst.findall(delegate(int x) );
listlstp = new list;
int index = lstp.findindex(delegate(person p) );
}
public class person
public string name;
public int age;
}
(1)、泛型還是非泛型使用predicate委託,都可以用匿名或者實名委託。
(2)、
但是非泛型類要傳入
泛型陣列
t array, 泛型list不需要傳入
(3)、方法原型
public static t find(t array, predicatematch);
public static int findindex(t array, predicatematch);
public listfindall(predicatematch);
public int findindex(predicatematch);
4、lambda表示式
參見
從委託的角度來看,lambda表示式與匿名方法沒有區別。在
【c#基礎:匿名方法】
一文中,我使用了匿名方法來呼叫list的findall方法。從c# 3.0開始,在使用匿名方法的地方,完全可以用lambda表示式來代替。lambda表示式的定義方式為:「([引數列表]) => 表示式」。運算子「=>」是一種與賦值運算「=」具有相同優先順序的右結合運算子,在英語裡讀作:「goes to」。
現在回過頭來看我們的例子。下面的**與【c#基礎:匿名方法】一文中的**具有相同的效果:
class program
}
}
上面的lambda expression implementation在效果上與匿名方法沒有任何區別,「=>」左邊的name定義了引數(當引數個數為1的時候,圓括號可以省略),「=>」右邊定義執行體。由於c# 3.0編譯器具有type inference的能力,引數型別與返回值都將由編譯器通過上下文判定,因此與匿名方法不同,lambda表示式的引數可以不給定引數型別。當所表示的匿名方法沒有任何引數時,lambda表示式也同樣可以使用,只需在「=>」左邊用一對圓括號表示即可。即:
() => console.writeline(
"hello!"
);
事實上,「lambda表示式」這一詞比較籠統,事實上「=>」運算子既可以表示lambda表示式,也可以表示lambda語句。lambda語句由**塊組成,形式上很像匿名方法。請看下面的例子:
兩種定義方法同樣可以正確地輸出結果。請注意,當我們希望構建表示式樹的時候,情況卻完全不同了:class program
;
console.writeline(dele1(16));
console.writeline(dele1(8));
}
}
// ok
expressionint
, bool
>> expr1 = n => n > 10;
// error: cannot converted to an expression tree
expressionint
, bool
>> expr2 = (
intn) => ;
由此可見,在構建表示式樹的時候,不能用lambda語句(帶有**語句的lambda表示式),而應該使用lambda表示式。從這裡就可以看出匿名方法與lambda表示式的區別了。
..
C 委託 匿名委託
c 委託 匿名委託 委託變數在繫結方法時,是把方法名賦值給了委託變數名,這 樣就需要在類裡面定義方法,而有些方法只用到了 次,這樣的 方法在類裡面過多時,程式的可讀性就不是太好,針對這種情 況,可以使用匿名委託,即不用在類裡面額外定義方法.delegate定義的匿名委託 格式 delegate 引數...
匿名委託 為事件 event 註冊匿名委託
create a handler for a click event.button1.click delegate system.object o,system.eventargs e 註冊方法注意事項 1.操作符後 無 new 關鍵字 2.如需要 為 click 註冊匿名委託,則在 click 上...
匿名委託 為事件 event 註冊匿名委託
create a handler for a click event.button1.click delegate system.object o,system.eventargs e 註冊方法注意事項 1.操作符後 無 new 關鍵字 2.如需要 為 click 註冊匿名委託,則在 click 上...