**委託(delegate):乙個表示方法的資料型別。間接派生於system.delegate
委託是乙個引用型別,但不必用new來例項化它。直接傳遞名稱,而不是現實例項化。這是c#2.0開始支援的乙個新語法,成為委託推斷(delegate inference)
1namespace
delegateex 2
17if (comparisonmethod == null
) 18
2122for (i = items.length - 1; i >= 0; i--)
23
33}
34}
35}
36//
匹配委託的引數greaterthan(int first, int second)
37public
static
bool greaterthan(int first, int
second)
38
41}
42class
program
43
52//
將委託例項作為引數傳遞
53delegatesample.bubblesort(items,delegatesample.greaterthan);
5455
for (int i = 0; i < items.length; i++) 56"
,items[i]);
58}
59console.readkey();
60}
61}
62 }
**匿名方法:就是沒有實際方法宣告委託例項,或者說,他們的定義是直接內嵌在**中的。
1static
void main(string
args) 2
11//
委託的定義直接內嵌在**中。
12 comparisonmethod = delegate(int first, int
second)
13;
16bubblesort(items,comparisonmethod);
1718
for (int i = 0; i < items.length; i++) 19"
, items[i]);
21}
22console.readkey();
23 }
或者使用更直接的方法:
1bubblesort(items,
2delegate(int first, int
second)
3);
注意,在任何情況下,引數和返回值型別必須相容於委託的資料型別。
*匿名方法是允許省略引數列表的,但是返回值型別需要與委託一致。
**系統定義的委託:
system.func 在.net 3.5中代表有返回型別的委託
system.action代表無返回型別的委託。
不能將乙個委託型別賦給另乙個委託型別的變數,即使型別引數匹配。
*為委託使用可變性[還沒理解]
action broadaction=delegate(objectdata)
action
narrowaction=broadaction;
func
narrowfunction=delegate();
func
broadfunction=narrowaction;
func
func1=degate(
object
data)
;func
func2=fun1;
**lamda表示式 (關鍵字=>) :分為lamda表示式和lamda語句
[csharp]view plain
copy
1bubblesort(items,
2delegate(int first, int
second)
3);
與上述等價的lamda語句(用於)
1bubblesort(items,
2 (int first, int second)=> 3
6 );
*省略引數型別:通常,只要編譯器能推斷出引數型別,或者能將引數型別隱式轉換成期望的資料型別,語句lamda就不需要引數型別。如果要制定型別,那麼制定的型別必須和委託型別完全匹配。只要lamda語句包含了乙個型別,則所有的型別都要加上。
1bubblesort(items,
2 (first,second)=> 3
6 );
*c#要求用一對圓括號來封閉lamda表示式的引數類表,不管是否指定了這些引數的資料型別。圓括號的另外乙個規則是,當編譯器能推斷出資料型別,而且只有乙個輸入引數的時候,語句lamda可以不帶圓括號。
funcgetuserinput=
string input;;
dowhile(input.trim()==0);
return input;
}*lamda表示式(滿足……條件)
bubblesort(items,
(int first, int second)=> first < second );
**lamda表示式本身沒有型別
所以.運算子不會被編譯,呼叫object的方法也不行。*外部變數:在lamda表示式(包括引數)的外部宣告,但是lamda表示式的內部捕捉(訪問)的區域性變數稱為外部變數。this也是乙個外部變數。不能出現在is的左側
lamda表示式一旦被賦值或者轉型,就會有lamda表示式的型別這種非正式的說法
不能賦值給隱式型別的變數
如果目的在lamda表示式的外部,c#就不允許在匿名函式內部使用跳轉語句(break,continue,goto)
intcomparisoncount=0;
bubblesort(item,
(int first ,int second)=>
comparisoncount++;
return firstconsole.writeline(comparisoncount);
**表示式樹[不理解]
「解釋」是c#引入表示式樹(expression trees)這一概念的重要動機。如果一種lamda表示式代表的是與表示式有關的資料,而不是編譯好的**,這中lamda表示式就是表示式樹。由於表示式樹代表的是資料而非編譯好的**,所以可以把資料轉換成一種替代格式。例如,轉換成sql**。
persons.where(person=>person.name.toupper()=="inigo montoya")select *from person where upper(name)='inigo montoya'
C 匿名方法和拉姆達表示式
匿名方法本質上是一傳遞給委託的 塊,是使用委託的另一種方法。規則 1 匿名方法中不能使用跳轉語句跳至次匿名方法的外部,反之亦然 匿名方法外部的跳轉語句也不能跳轉到匿名方法的內部 2 在匿名方法的內部不能訪問不安全的 另外,也不能訪問在匿名方法外部定義的ref和out引數。3 可以使用在匿名方法外部定...
C 匿名方法和拉姆達表示式
匿名方法本質上是一傳遞給委託的 塊,是使用委託的另一種方法。規則 1 匿名方法中不能使用跳轉語句跳至次匿名方法的外部,反之亦然 匿名方法外部的跳轉語句也不能跳轉到匿名方法的內部 2 在匿名方法的內部不能訪問不安全的 另外,也不能訪問在匿名方法外部定義的ref和out引數。3 可以使用在匿名方法外部定...
匿名函式 委託和Lambda表示式
其中匿名的函式簽名可以包括兩種,一種是隱式的匿名函式簽名另一種是顯式的匿名函式簽名 隱式的函式簽名 p p1,p1 顯式的函式簽名 int p int p1,int p2 ref int p1,out int p2 匿名的函式體可以是表示式或者 塊。從上面我們可以看出,lambda表示式的引數形式可...