delegate event action func 匿名方法 lambda表達式
delegate類似c++的函數指針,但是是類型安全的,可以指向多個函數,
public delegate void DelegateMethod(); //聲明了一個Delegate Type
public DelegateMethod delegateMethod; //聲明了一個Delegate對象
var test = new TestDelegate();
test.delegateMethod = new TestDelegate.DelegateMethod(test.NonStaticMethod);
test.delegateMethod += new TestDelegate.DelegateMethod(TestDelegate.StaticMethod);
event用來修飾delegate,不加event的委托就是一個普通的委托,可以直接通過委托調用,加了event的委托是一個事件,只能通過類的成員函數調用。
action是沒有返回值的委托,Action 表示無參,無返回值的委托, Action<int,string> 表示有傳入參數int,string無返回值的委托。
func指有返回值的泛型委托,Func<int> 表示無參,返回值為int的委托,Func<object,string,int> 表示傳入參數為object, string 返回值為int的委托
predicate 是返回bool型的泛型委托
匿名方法,不需要使用特定的方法,簡化代碼,
- host.Opened += delegate(object sender, EventArgs e)
- {
- Console.WriteLine("Service Opened.");
- };
不帶參數和返回值的匿名方法,可以被具有任何形式簽名的委托所指代,如果有一個重載的方法,參數為兩種類型的委托,調用這個方法時如果使用不帶參數和返回值的匿名方法會編譯錯誤
- static void Output(IntDelegate id)
- {
- }
- static void Output(StringDelegate sd)
- {
- }
- static void Main(string[] args)
- {
- Output(delegate { });
- }
lambda表達式也是一種匿名方法,(參數列表)=>表達式或語句塊,在編寫Lambda表達式時,可以忽略參數的類型,因為編譯器能夠根據上下文直接推斷參數的類型,
- (x, y) => x * y //多參數,隱式類型=> 表達式
- x => x * 5 //單參數, 隱式類型=>表達式
- x => { return x * 5; } //單參數,隱式類型=>語句塊
- (int x) => x * 5 //單參數,顯式類型=>表達式
- (int x) => { return x * 5; } //單參數,顯式類型=>語句塊
- () => Console.WriteLine() //無參數