在 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 表示式作為引數進行傳遞,或者將它作用於函式呼叫...