1. 程式人生 > >匿名方法、Lambda表示式和事件

匿名方法、Lambda表示式和事件

匿名方法

在前面我們知道委託可以指向一個或多個方法,當有一個方法只需要用一次並且很簡短,例如:

static int Test1(int arg1,int arg2)
        {
            return arg1 + arg2;
        }

//使用委託指向這個方法
static void Main(string[] args)
        {
            Func<int, int, int> f = Test1; //常用的使用委託的方法
        }

我們可以對程式碼進行簡化,讓其看起來更為簡潔,所以我們可以使用匿名方法,直接忽略方法名,因為我們需要用委託指向這個方法,所以這個方法是什麼名字對於委託來說不重要。我們在建立委託變數的時候就可以直接建立匿名方法,並且不需要返回值:

static void Main(string[] args)
        {
            //使用匿名方法 本質上是一個沒有名字的方法,只要能使用委託變數的地方就能使用匿名方法
            Func<int, int, int> f = delegate(int arg1, int arg2)
            {
                return arg1 + arg2;
            };
        }

這樣我們就不需要再額外定義一個方法,直接使用委託變數指向這個方法,因為編譯器會根據return後面的值來判斷返回值,所以我們也不需要寫返回值。
需要注意的是,我們需要使用delegate關鍵字定義這個方法。

Lambda表示式

Lambda表示式其實也是匿名方式,只是換了一種表現形式。在匿名方式的例子裡我們可以看得出,匿名方式將原來的程式碼簡化成4行,但是其實我們可以使用Lambda表示式將程式碼再次簡化。

Func<int, int, int> f = (arg1, arg2) => { return arg1 + arg2; };

這樣我們直接將程式碼簡化成一行,因為在Func委託裡,已經寫了引數的型別,所以我們後面不需要再重新定義資料的型別。在Lambda表示式中,我們只需要寫引數以及方法體就可以了。

當引數只有一個的時候,大括號和return都可以省去

Func<int, int> a = b => b + 1;

這個語句的意思是建立了一個名字為a的委託變數,指向了一個只有b引數的方法,方法體為返回一個b+1的值。

關於Lambda表示式外部的變數
我們通過Lambda表示式也可以訪問方法外部的變數,但是這個功能使用的時候需要謹慎,因為如果訪問了外部的變數,那麼這個表示式就不僅僅受傳入的引數的控制了,結果可能還會因外部的變數的改變而改變。
例如:

//訪問外部變數
            int val = 15;
            Func<int, int> c = plus => plus + val;
            Console.WriteLine(c(10));
            val = 20;
            Console.WriteLine(c(10));

這段程式碼中,輸出的結果是不一樣的,因為Lambda表示式中訪問了外部val這個變數,當val的值改變,這個表示式所返回的值也隨之改變。

事件

我們可以認為事件是一種具有特殊簽名的委託,它基於委託,為委託提供了一個釋出/訂閱機制。
事件的宣告

public event 委託型別 事件名;
public delegate void MyDelegate();

事件使用event關鍵字來宣告,它的返回型別是一個委託型別,通常來說,事件的命名是以名字+Event作為它的名稱,在寫程式碼過程中,我們需要儘量使用規範命名,增加程式碼可讀性。
在下一篇文章中會寫一個例子,來弄清楚委託和事件的區別。

相關推薦

匿名方法Lambda表示式事件

匿名方法 在前面我們知道委託可以指向一個或多個方法,當有一個方法只需要用一次並且很簡短,例如: static int Test1(int arg1,int arg2) { return arg1 + arg2;

C# Error CS1628: 不能在匿名方法lambda 表示式或查詢表示式中使用 ref 或 out 引數

寫c#windows窗體應用的時候, 在一個函式裡傳遞了ref的引數, 並且在這個函式裡呼叫了窗體的invoke方法,結果出了cs1628的錯誤。去Stack Overflow上找了一篇解釋,特翻譯在下

《C#高階程式設計》【第八章】委託lambda表示式事件 -- 學習筆記

       之前由於考試的關係,耽誤了不少時間。然而考試也考的不怎麼樣,說多了都是淚。下面我們直接進入今天的正題 --- 委託。        委託是一個神奇的東西。委託的出現,使得方法可以作為引數進行傳遞。其中我們接觸最多的應該就是通用庫類。通用庫類,正是由於這種機制

C# -委託泛型委託匿名方法Lambda表示式

前言    這幾天一直在回顧之前的知識,不是常用的都已經忘記了,俗話說得好,書到用時方恨少。之前對於委託一直都是雲裡霧裡的,在此總結一下,以便日後檢視! 委託

C#不能在匿名方法lambda表示式查詢表示式或本地函式中使用refOut或in引數

C#中傳入的ref引數不能直接用於Linq語句中,需要先用變數接收再賦值:  public static bool A

【轉】【UNITY3D 遊戲開發之七】C# 中的委託事件匿名函式Lambda 表示式

"委託是一個類,它定義了方法的型別,使得可以將方法當作另一個方法的引數來進行傳遞,這種將方法動態地賦給引數的做法,可以避免在程式中大量使用If-Else(Switch)語句,同時使得程式具有更好的可擴充套件性。" from: http://www.himigame.com/

委託匿名方法lambda表示式

在專案中我們經常會接觸lambda表示式,操作簡潔明瞭。幫我們省了不少事。面對這麼神奇的一個東西,是不是也應該瞭解瞭解它的本質呢。 今天我們通過一步一步的演變揭開lambda表示式的本質  一.委託 C# 中的委託類似於 C 或 C++ 中函式的指標。委託是存有對某個方法的引用的一種引用型別變數。引

【轉】編寫高質量代碼改善C#程序的157個建議——建議150:使用匿名方法Lambda表達式代替方法

等於 urn lambda表達式 工作 value 語法 eve style 高質量 建議150:使用匿名方法、Lambda表達式代替方法 方法體如果過小(如小於3行),專門為此定義一個方法就會顯得過於繁瑣。比如: static void SampeM

C# 委託,匿名方法lambda表示式使用方法

在 2.0 之前的 C# 版本中,宣告委託的唯一方法是使用命名方法。 C# 2.0 引入了匿名方法,而在 C# 3.0 及更高版本中,Lambda 表示式取代了匿名方法,作為編寫內聯程式碼的首選方式。 有一種情況下,匿名方法提供了 Lambda 表示式中所沒有的功能。

C#程式設計 委託 Lambda表示式事件

委託 如果我們要把方法當做引數來傳遞的話,就要用到委託。簡單來說委託是一個型別,這個型別可以賦值一個方法的引用。 宣告委託 在C#中使用一個類分兩個階段,首選定義這個類,告訴編譯器這個類由什麼欄位和方法組成的,然後使用這個類例項化物件。在我們使用委託的時候,也需要經過這兩個階段,首先定義

c#委託(Delegates)--匿名方法Lambda表示式

以下通過程式碼對比,委託+方法、匿名方法、Lambda表示式的區別。一.委託+方法這裡用上一篇中的例項:namespace Func { public delegate int MyDel(int num);//宣告一個自定義委託 class Pr

c#匿名類與匿名函式lambda表示式

匿名類(隱式型別) 關鍵字:var 在linq查詢獲取結果時經常會用到,例如: var result = from a in b where b.id = 1

C# 入門(9) 委託(delegate),匿名方法Lambda表示式

C#的委託,匿名方法,Lambda表示式   委託就像C++的函式指標一樣,可以指向一個函式,但委託更牛逼,指的其實是一個函式列表,依次執行函式。   在C++中,匿名方法和Lambda表示式其實是一回事,C#裡就是兩回事了。 委託 委託

C#的委託匿名委託lambda表示式

什麼是委託:包含單個方法的委託和函式指標是相似的,不同的是,委託是面向物件的並且是型別安全的。宣告委託型別:// Declare a delegate.delegate void Del(string str);宣告委託和宣告方法差不多,兩個不通點就在於委託以:delegat

匿名方法 VS Lambda表示式

一、匿名方法: 引入背景: C#引入匿名方法是為了簡化代理函式(delegate method)定義。 關於anonymous method的語法參考官網。 留心容易被忽略的地方: 1. 匿名方法不能訪問外部方法的ref和out引數。 Why?! 不安全 2. 匿名方法內

十二事件,委托,泛型委托,集合(泛型非泛型),Lambda表達式(聲明委托,使用委托,簡單的委托示例,action<T>func<t>委托,多播委托,匿名方法Lambda表達式,參數,事件

multicast new 調用方法 多播 ted 被調用 輸入參數 pac cas 事件(Event) 事件是一種對象或類能夠提供通知的成員,客戶端可以通過提供事件處理程序為相應的事件可添加可執行代碼,事件可以理解為一種特殊的委托。 委托(Delegate) 委托是存有對

Action<T>Func<T>泛型委託,委託,泛型,匿名函式,Lambda表示式的綜合使用

前言 在上篇文章C#中委託(delegate)和多播委託的理解中已經基本瞭解了委託的用法。 由於委託封裝的方法我們不一定知道其傳入的引數和返回值,例如之前說的的排序方法—————在物件的排序演算法中,需要對物件進行比較,而不同物件比較的方法不同,所以比較兩個物件的方法的引用可以作為引數傳

重溫C#委託,匿名方法Lambda,泛型委託,表示式樹程式碼示例

帶你重溫C#委託,匿名方法,Lambda,泛型委託,表示式樹程式碼示例:     這些對老一代的程式設計師都是老生常談的東西,沒什麼新意,對新生代的程式設計師卻充滿著魅力。曾經新生代,好多都經過漫長的學習,理解,實踐才能掌握委託,表示式樹這些應用。今天我嘗試用簡單的方法敘述一下,讓

ActionFunc泛型委託,委託,泛型,匿名函式,Lambda表示式的綜合使用

前言 在上篇文章C#中委託(delegate)和多播委託的理解中已經基本瞭解了委託的用法。 由於委託封裝的方法我們不一定知道其傳入的引數和返回值,例如之前說的的排序方法—————在物件的排序演算法中,需要對物件進行比較,而不同物件比較的方法不同,所以比較兩個物件

採用Java 8中Lambda表示式預設方法的模板方法模式

原文連結 作者:   Mohamed Sanaulla  譯者: 李璟([email protected]) 模板方法模式是“四人幫”(譯者注:Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides)所著《Design