C C 基礎回顧 匿名方法

2022-01-12 11:40:07 字數 2648 閱讀 9904

在 c# 2.0 之前的版本中,我們建立委託的唯一形式 -- 命名方法。

而 c# 2.0 -- 引進了匿名方法,在 ≥ c# 3.0 的版本中,我們會用 lambda 表示式進行取代匿名方法,並且用 lambda 表示式作為編寫內聯**的首選方式,因為它更簡潔。

匿名方法是,顧名思義,匿名方法就是沒有名稱的方法。匿名方法最明顯的好處就是:可以降低額外另寫乙個方法的工作量;另外乙個好處就是可以直接訪問呼叫者的變數,從而降低傳參的複雜度。

匿名方法,它不是乙個事先定義的方法,而是使用乙個委託的**塊,在使用時,和普通方法並沒有什麼區別,但是匿名方法可以在一定程度上減少系統開銷。

匿名方法,關鍵字:delegate。

匿名方法,使用場景:通常在,①需要乙個臨時的方法,並且該方法使用的次數極少;②該方法的**很短,不長。

【注意】有一種情況,匿名方法它提供了 lambda 表示式所沒有具備的功能。 那就是,你可以使用匿名方法來忽略引數列表。 這意味著匿名方法可以轉換為具有各種簽名的委託,而這些,對於 lambda 表示式來說,幾乎是完全不可能的。

想要將**塊作為委託引數進行傳遞,使用匿名方法是目前唯一的方式。 

示例一:

//

建立乙個點選事件

button1.click += delegate

(object o, eventargs e)

;

示例二:

//

建立乙個委託.

delegate

void mydel(int

x);

//使用匿名方法並將委託例項化

mydel del = delegate(int k) ;

使用匿名方法,由於無需單獨額外建立方法,從而減少了上述兩個示例例項化委託所需要的編碼開銷。

例如,如果建立方法所需的系統開銷並不是必要的,則指定**塊(而不是委託)就會非常有用。

我在這裡通過乙個示例演示,如何用乙個匿名方法的形式建立並啟動乙個新的執行緒:

//新建執行緒啟動的示例   

void

start()

);//啟動

thread.start();

}

匿名方法的引數使用範圍:匿名方法塊。

如果目標在塊外部,你在匿名塊內部使用 -- 跳轉的關鍵字(類似 goto/break/continue),就是錯誤的;如果目標在塊內部,你在匿名塊外部使用 -- 跳轉的關鍵字(類似 goto/break/continue),也是錯誤的。

如果區域性變數和引數的範圍已經包含匿名方法宣告,則該區域性變數和引數將被稱為該匿名方法的「外部」(外界)變數。你看,這個**段中的num就是乙個外部(外界)變數:

int num = 250

; mydel del = delegate()

", --num); };

這個外部變數的所引用的num,將會被認為是在建立委託時進行捕獲的,它與我們常用的本地變數不同,這個外部變數的生存期 -- 引用該匿名方法的委託物件被 .net 的 clr 的垃圾**機制進行**。

【注意】匿名方法無法訪問外部(外界)範圍內,帶 ref 與 out 關鍵字的引數。

【注意】在匿名塊中不能訪問 unsafe 的**。

【注意】在 is 運算子的左邊,是用不了匿名的方法的。

下面的示例,將會同時使用匿名方法和命名方法去呼叫委託時:

//

宣告委託

delegate

void mydel(string

s);

class

myclass

;//直接呼叫

p("使用匿名方法呼叫委託。");

//上面的形式再簡寫

p =console.writeline;

console.writeline(

"上面簡寫的形式");

//使用"do"的靜態方法的委託例項化。

p = new

mydel(myclass.do);

//使用舊的風格呼叫委託

p("使用命名方法呼叫委託。");

console.read();

}//後續用於委託呼叫

《c# 知識回顧 - 序列化》

《c# 知識回顧 - 表示式樹 expression trees》

《c# 知識回顧 - 特性 attribute》、《剖析 assemblyinfo.cs - 了解常用的特性 attribute》

《c# 知識回顧 - 委託 delegate》、《c# 知識回顧 - 委託 delegate (續)》

《c# 知識回顧 - 事件入門》、《c# 知識回顧 - event 事件》

《string 與 string,大 s 與小 s 之間沒有什麼不可言說的秘密》

《c# 知識回顧 - 你真的懂異常(exception)嗎?》

《了解過入口函式 main() 嗎?帶你用批處理玩轉 main 函式》

【博主】反骨仔

【出處】

【參考】微軟官方文件

C 基礎 匿名方法

匿名方法是c 2.0的語言新特性。首先看個最簡單的例子 view plaincopy to clipboardprint?class program static bool namematches string name 這段 在開始的時候初始化了乙個字串列表 string list 然後通過列表的...

C C 知識回顧 指標

1 非空的區別。引用不能為空。2 可修改區別。引用一旦被初始化,就會一直指向初始化的物件。3 合法性區別。在程式設計時,使用指標之前應該檢測其是否為空值。4 應用區別。指標多用於可能會不指向任何物件的情況 int f int int int f是乙個函式指標,它指向引數是兩個int的函式,該函式的返...

C C 知識回顧 Lambda

它是第十乙個希臘字母,乙個擁有失意 無奈 孤獨 低調等含義的流行符號,也指示一款稱為 半條命 的遊戲。不過,這次我所講的是 c 中的 lambda。lambda 表示式,是一種簡化的匿名函式,可用於建立委託或表示式目錄樹。其次,你也可以將 lambda 表示式作為引數進行傳遞,或者將它作用於函式呼叫...