C 匿名方法

2021-09-24 20:01:31 字數 3232 閱讀 6568

在c#1.1裡,宣告和使用委託要求你有委託和乙個在委託被觸發時具有匹配簽名的能夠執行的方法,以及乙個將命名方法與委託關聯的分配語句。

namespace

匿名方法示例

static

void main(string

args)

}}

在c#2.0裡,引入了匿名方法這個新特性,它允許開發者內聯(inline)宣告自己的函式**而無須使用委託函式(delegate function)。匿名方法基本省能夠提供與先前命名方法相同的功能,但是它已經不在需要乙個在關聯到委託之前就明確建立的方法了。當編譯器遇到匿名方法時,編譯器會在類裡面建立乙個命名方法,並將這個命名方法與委託進行關聯。匿名方法的實現和命名方法的實現所取得的il結果兩者之間差別非常小,效能相差也非常小。

namespace

匿名方法示例

;

int result = anonymousfunction(1, 2

); console.writeline(result);}}

}

匿名方法中的引數:

1.匿名方法可以接受實參,但什麼都不做:

namespace

匿名方法示例

;

int result = anonymousfunction(1, 2

); console.writeline(result);}}

}

2. 匿名方法忽略引數,雖然其對應的delegate的定義是含有引數的:

namespace

匿名方法示例

;

int result = anonymousfunction(1, 2

); console.writeline(result);}}

}

注意:關於匿名方法的引數使用,只能以上兩種情況二選一,要麼忽略所有引數(引數個數為0與忽略引數是不同的,要區別對待),要麼引數形式同其委託引數形式一致,否則編譯器將會報錯。

例如以下情況,編譯器都會報錯:

namespace

匿名方法示例

; sample anonymousfunction1 = delegate(int x) ;

int result = anonymousfunction(1, 2

); console.writeline(result);}}

}

另外,匿名方法也可以宣告泛型引數,乙個帶泛型引數的匿名方法可以賦給乙個同型別的delegate例項,只需確保其符合delegate簽名即可

namespace

匿名方法示例

}//////

匿名方法與泛型

/// class testclass;

anonymousfunction(t);}}

}

匿名方法的返回值:

1.如果委託型別的返回值型別為void,匿名方法裡不能返回任何值,上面的委託與范型的例子中即返回值為void。

2.如果委託型別的返回值型別不為void,匿名方法的返回值也不能為void,即與委託型別返回值一致即可,上面的例子中返回值為int。

匿名方法的外部變數:

匿名方法有時會使用一些區域性變數和引數,這些區域性變數和引數被稱為「匿名方法的外部變數」。外部變數的生存期會由於「匿名方法的捕獲效益」而延長,直到委託例項不被引用為止。

namespace

匿名方法示例

; console.writeline(test);

console.writeline(

"before invoke:

" +test);

anonymousfunction.invoke();

console.writeline(

"after invoke:

" +test);

console.writeline(test);

console.readkey();}}

}

程式輸出:

100before invoke:100

100200

after invoke:200

200

namespace

匿名方法示例

; console.writeline(

"before invoke:

" +test);

anonymousfunction.invoke();

console.writeline(

"after invoke:

" +test);

}static

void main(string

args)

}}

程式輸出:

100before invoke:100

100200

after invoke:200

100

匿名方法對於外部變數的使用和正常的區域性變數使用的方式沒有太大的區別。

何時使用匿名方法:

1. 需要乙個臨時方法,該方法使用次數極少;

2. 這個方法的**很短,甚至可能比方法宣告都短;

注意:

匿名方法不能訪問外部範圍的 ref

或 out

引數。在「匿名方法塊」中不能訪問任何不安全**。

在 is

運算子的左側不允許使用匿名方法。

在c#3.0中,引入了乙個新的特性---lambda表示式,它提供了完成相同目標的更加簡介的格式。但有一種情況,匿名方法提供了 lambda 表示式中所沒有的功能。 可使用匿名方法來忽略引數列表。 這意味著匿名方法可轉換為具有各種簽名的委託。 這對於 lambda 表示式來說是不可能的。

namespace

匿名方法示例

;

int result = plusdelegate(1, 2

); console.writeline(result);}}

}

c 匿名方法用途 C 匿名方法

我們討論了使用委託來引用具有與委託相同簽名的任何方法。換句話說,您可以使用該委託物件呼叫可由委託引用的方法。匿名方法提供了一種將 塊作為委託引數傳遞的技術。匿名方法是沒有名稱的方法,只是主體。您無需在匿名方法中指定返回型別 它是從方法體內的return語句推斷出來的。編寫匿名方法 匿名方法是通過建立...

c 匿名方法用途 C 匿名方法

c 語言 的 c 匿名方法 前面我們學習過,委託可用於引用任何與委託簽名相同的方法。換句話說,可以呼叫可以由委託使用該委託物件引用的方法。匿名方法提供了一種將 塊作為委託引數傳遞的技術。匿名方法是沒有名稱的方法,只有方法體。不需要在匿名方法中指定返回型別 它是從方法體中的return語句來推斷的。編...

C 匿名方法

1,匿名方法 c 為委託提供一種機制,可以為委託定義匿名方法,匿名方法沒有名稱,編譯器會定指定乙個名稱 匿名方法中不能使用跳轉語句跳轉到該匿名方法的外部,也不能跳轉到該方法的內部。也不能在匿名方法外部使用的ref和out引數 2,匿名方法的 拉姆達 表示式 方式定義 c 3.0之後匿名方法可以使用 ...