C#匿名方法和lambda
1.當一個呼叫者想監聽傳進來的事件,他必須定義一個唯一的與相關聯委託簽名匹配的方法,而該方法基本不會被呼叫委託之外的任何程式所呼叫。這裡可以在事件註冊時直接講一個委託與一段程式碼相關聯,這種程式碼成為匿名方法。
示例:
public class MyClass9
{
public EventHandler TestEventHandler ;
public void Func1()
{
TestEventHandler += delegate(object sender, EventArgs e)
{
Console.WriteLine("匿名方法");
};
TestEventHandler(this, new EventArgs());
}
}
2.匿名方法注意事項
匿名方法不能訪問定義方法中的ref或out引數
匿名方法中的本地變數不能與外部方法中的本地變數重名
匿名方法可以訪問外部類作用域中的例項變數(或靜態變數)
匿名方法內的本地變數可以與外部類的成員變數同名(本地變數隱藏外部類的成員變數)
3.C#支援內聯處理事件,通過直接把一段程式碼語句賦值給事件(使用匿名方法),而不是構建底層委託呼叫的獨立方法。Lambda表示式只是用更簡單的方式來寫匿名方法,徹底簡化了對.net委託型別的使用。
4.使用匿名方法示例:
List<T> 的FindAll()方法:
public List<T> FindAll(Predicate<T> match); //該方法的唯一引數為System.Predicate<T>型別的泛型委託。
public delegate bool Predicate<T> (T obj); //該委託指向任意型別引數作為唯一輸入引數並返回bool的方法。
使用普通:
public class MyClass10
{
private void Func1()
{
List<int> listInt = new List<int> { 1, 2, 3, 4, 5, 6 };
Predicate<int> callback = new Predicate<int>(CallBackFunc);
listInt.FindAll(callback);
}
private bool CallBackFunc(int obj)
{
if (obj > 3)
{
return true;
}
return false;
}
}
使用匿名方法:
public class MyClass10
{
private void Func1()
{
List<int> listInt = new List<int> { 1, 2, 3, 4, 5, 6 };
listInt.FindAll(
delegate(int i)
{
if (i > 3)
return true;
return false;
});
}
}
使用Lambda:
public class MyClass10
{
private void Func1()
{
List<int> listInt = new List<int> { 1, 2, 3, 4, 5, 6 };
listInt.FindAll(s => s > 3).ToList(); //這裡編譯器可以根據整個Lambda表示式的上下文和底層委託推斷出s是一個整形
}
}
5.多語句Lambda語句塊(使用大括號括起來)
listInt.FindAll(s =>
{
Console.WriteLine("aaaaaaa");
if (s > 3)
return true;
if (s <= 3)
return false;
return true;
}
);
6.使用Lambda重寫MyClass9
public class MyClass9
{
public EventHandler TestEventHandler ;
public void Func1()
{
TestEventHandler += (sender, e) =>
{
Console.WriteLine("Just Test");
};
}
}