初步熟悉C#中的Lambda表達式和匿名辦法。本站提示廣大學習愛好者:(初步熟悉C#中的Lambda表達式和匿名辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是初步熟悉C#中的Lambda表達式和匿名辦法正文
寫在後面
除夕三天在家閒著無事,就看了看Linq的相干內容,也預備體系的進修一下,作為進修Linq的前奏,照樣先得說說Lambda與匿名辦法的常識點。也算是對常識點的查漏補缺吧,或許你會說這沒啥年夜不了的,項目中都在用,然則有些常識,你回頭在檢查的時刻,總會有那末點紛歧樣的收成,這點我是感同身受的,我看書有個習氣,一本書,我能看個三四遍,每次總會有收成。固然,你可以說,其時確定沒賣力看,不是那模樣的,我以為最直接的緣由在於,其時你看是看,沒有在真實的項目中碰到過,所以你心裡對它的懂得其實不深,假如在有那末點項目經歷了,在去翻看書中的實際常識,心裡總會有那種名頓開的感到。信不信由你,橫豎我是信了!
匿名辦法
匿名辦法望文生義,是沒著名字的辦法,然則仍無方法體,仍無能活。在許多處所能夠你都見過它,好比js中,用的最多!
看看Msdn給的說法:
在 2.0 之前的 C# 版本中,聲明拜托的獨一辦法是應用定名辦法。 C# 2.0 引入了匿名辦法,而在 C# 3.0 及更高版本中,Lambda 表達式代替了匿名辦法,作為編寫內聯代碼的首選方法。 不外,本主題中有關匿名辦法的信息異樣也實用於 Lambda 表達式。 有一種情形下,匿名辦法供給了 Lambda 表達式中所沒有的功效。 您可以使用匿名辦法來疏忽參數列表。 這意味著匿名辦法可轉換為具有各類簽名的拜托。 這關於 Lambda 表達式來講是弗成能的。
namespace Wolfy.LinqDemo
{
/// <summary>
/// 創立一個拜托Del
/// </summary>
/// <param name="x">參數</param>
public delegate void Del(int x);
class Program
{
static void Main(string[] args)
{
//應用匿名辦法創立一個拜托對象d
Del d = delegate(int x)
{
Console.WriteLine(x);
};
}
}
}
經由過程應用匿名辦法,因為您不用創立零丁的辦法,是以削減了實例化拜托所需的編碼體系開支。
例如,線程類便可創立一個線程而且包括該線程履行的代碼。
Thread thread = new Thread(
delegate()
{
//辦法體
Console.WriteLine("Hello world");
});
可以更直白的如許懂得,假如該辦法就應用那末一次,那末便可以應用匿名辦法。
Lambda
界說
Lambda 表達式是一種可用於創立拜托或表達式目次樹類型的匿名函數。
若要創立 Lambda 表達式,須要在 Lambda 運算符 => 左邊指定輸出參數(假如有),然後在另外一側輸出表達式或語句塊。
/// <summary>
/// 創立一個拜托Del
/// </summary>
/// <param name="x">參數</param>
public delegate void Del(int x);
class Program
{
static void Main(string[] args)
{
Del del = x => Console.WriteLine(x * x);
del(2);//4
Console.Read();
}
}
若要創立表達式目次樹,可以如許:
/// <summary>
/// 創立一個拜托Del
/// </summary>
/// <param name="x">參數</param>
public delegate void Del(int x);
class Program
{
static void Main(string[] args)
{
Del del = x => Console.WriteLine(x * x);
del(2);//4
System.Linq.Expressions.Expression<Del> expression = x => Console.WriteLine(x);
Console.Read();
}
}
下面的例子創立了一個表達式目次樹對象expression,因為Del拜托是沒有前往值的,這裡是將其直接輸入。
表達式Lambda
表達式位於 => 運算符右邊的 lambda 表達式稱為“表達式 lambda”。表達式 lambda 會前往表達式的成果,並采取以下根本情勢:
(input parameters) => expression
留意:僅當 lambda 只要一個輸出參數時,括號才是可選的;不然括號是必須的。 括號內的兩個或更多輸出參數應用逗號加以分隔:
(x, y) => x == y
//有時,編譯器難以或沒法揣摸輸出類型。 假如湧現這類情形,你可以按以下示例中所示方法顯式指定類型
(int x, string s) => s.Length > x
//應用空括號指定零個輸出參數
() => SomeMethod()
語句Lambda
語句 lambda 與表達式 lambda 表達式相似,只是語句括在年夜括號中
(input parameters) => {statement;}
statement(語句Lambda)可以包括隨意率性數目的語句,但平日不會多於兩個或三個。
一個例子
namespace Wolfy.LinqDemo
{
/// <summary>
/// 創立一個拜托Del
/// </summary>
/// <param name="x">參數</param>
public delegate void Del(string strName);
class Program
{
static void Main(string[] args)
{
Del d = x =>
{
string s = "Hello" + " " + x;
Console.WriteLine(s);
};
d("wolfy");
Console.Read();
}
}
}
留意
像匿名辦法一樣,語句 lambda 也不克不及用於創立表達式目次樹
總結
這裡對Lambda及匿名辦法做了一個簡略引見。固然在項目中也常常應用,然則對Lambda的基本常識,照樣須要補一補。