概念了解:
1、什么是匿名委托(匿名方法的簡單介紹、為什么要用匿名方法)
2、匿名方法的【拉姆達表達式】方法定義
3、匿名方法的調用(匿名方法的參數傳遞、使用過程中需要注意什么)
什么是匿名方法?
匿名方法是C#2.0引入的一個新特性,它允許開發者聲明自己的函數代碼而無須使用委托函數。
C#為委托提供一種機制,可以為委托定義匿名方法,匿名方法沒有名稱,編譯器會定指定一個名稱,匿名方法中不能使用跳轉語句跳轉到該匿名方法的外部,也不能跳轉到該方法的內部。也不能在匿名方法外部使用的ref和out參數。
通過使用匿名方法,可以不必創建單獨的方法,因此減少了實例化委托所需的編碼系統開銷。例如,如果創建方法所需的系統開銷是不必要的,則指定代碼塊(而不是委托)可能非常有用。
什么時候該使用匿名方法
1.需要一個臨時方法,該方法使用次數極少;
2.這個方法的代碼很短,甚至可能比方法聲明都短的情況下使用。
匿名方法的聲明、調用
C#3.0之后匿名方法可以使用λ表達式來進行定義
無論是拉姆達(lambda)表達式(匿名函數、是匿名類) ,都能歸屬到一種叫閉包的東西上面。
左邊是參數,使用括號表達 (string param),可以是 (param)這樣不定義類型,編譯器會推斷出來,只有一個參數的時候可以不使用括號。右邊是實現代碼,使用花括號,如果代碼只有一行,則不使用花括號和return關鍵字也可以,編譯器會為我們添加。
這是λ表達式的簡單實現↓
delegate string MyDelegate(string message);
string str1 = "str1";
string str2 = "str2";
MyDelegate my1 = param => param + str1 + str2;
MyDelegate my2 = (string param)=>{return param + str1 + str2;};
Console.WreiteLine(my("param"))
Console.WreiteLine(my2("param"));
class Program
{
delegate void MyDelegate(string message);
static void Main(string[] args)
{
1.一般的調用命名方法
MyDelegate mydelegate = Write;
//委托
mydelegate += delegate(string m)
{
Console.WriteLine("{0} this is using delegate",m);
};
//拉姆達
mydelegate += (string m)=>
{
Console.WriteLine("{0} this is using lambda",m);
}
mydelegate("C#");
static void Write(string message)
{
Console.WriteLine("{0} this is using named method", message);
}
}
使用c# 自帶的委托:Action、Action<T>、Func<T>
Func<String> func1 = () => { return "Func1"; };
//Func<String> func1 = delegate { return "Func1"; };
Console.WriteLine(func1());
Func<String, String> func2 = m => { return m; };
//Func<String, String> func2 = delegate(string m) { return m; };
Console.WriteLine(func2("Func2"));
Func<String, int, String> func3 = (string m, int i) => { return m + i; };
//Func<String, int, String> func3 = delegate(string m, int i) { return m + i; };
Console.WriteLine(func3("Func", 3));
Func泛型示意圖:
delegate TResult Func<out TResult>(); Func<TResult> Func<T, TResult> Func<T1, T2, TResult> Func<T1, T2, T3, TResult> Func<T1, T2, T3, T4, TResult> Func<T1, T2, T3, T4, T5, TResult> Func<T1, T2, T3, T4, T5, T6, TResult> Func<T1, T2, T3, T4, T5, T6, T7, TResult> Func<T1, T2, T3, T4, T5, T6, T7, T8, TResult> Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, TResult> Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, TResult> Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, TResult> Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, TResult> Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, TResult> Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, TResult> Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, TResult> Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, TResult>
一個將匿名方方法用於多線程的實例實現參數傳遞
string[] Arr = new string[] { "Thread1", "Thread2", "Thread3", "Thread4" };
Thread[] Multithreading=new Thread[Arr.Length];
for (int i = 0; i < Arr.Length; i++)
{
Multithreading[i] = new Thread(new ThreadStart(() =>
{
Console.WriteLine(Arr[i]);
}));
Multithreading[i].Start();
}
使用Action<T>拓展自己的ForEach
public static IEnumerable<T> Foreach<T>(this IEnumerable<T> source, Action<T> func)
{
foreach (var item in source)
{
func(item);
}
return source;
}
IEnumerable<News> news = db.News.Select(p => p.ID>10).Foreach(p =>
{
p.ID = p.ID + 3;
Console.WriteLine(p.ID);
});
