匿名委託 Invoke,Predicate 委託

2021-06-23 04:56:19 字數 4263 閱讀 1137

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 上...