委託
委託的概念:
委託是用戶自定義的類,它定義了方法的類型。儲存的是一系列具有相同參數和返回類型方法的地址列表,調用委託時,此委託列表的所有方法都將被執行。
委託類型的定義:
委託類型必須在被用來創建變量以及類型對象之前聲明。
委託類型的聲明:
1.以delegate關鍵字開頭。
2.返回類型+委託類型名+參數列表
delegate void MyDel(int a)
實例
class Program
{
//1、聲明一個委託
delegate int Mydel(int a, int b);
static void Main(string[] args)
{
//3、定義委託類型變量
Mydel mydel;
//4、進行委託綁定
mydel = new Mydel(add);
//5、回調綁定的add方法
int result = mydel(1, 1);
Console.WriteLine(result);
}
//2、創建一個與委託關聯的方法,兩者具有相同的返回值類型和參數列表
public static int add(int a,int b)
{
return a + b;
}
}
委託之Action< T >不帶返回值的委託類型
委託之Func< T >帶返回值的委託類型
class Program
{
static void Main(string[] args)
{
//帶返回值得委託類型
Func<int, int, int> f = add;
Console.WriteLine("有返回的結果:{0}",f(1,1));
//不帶返回值的委託類型
Action<double, int> a = over;
a(2, 2);
}
//定義一個有返回值的方法
public static int add(int a,int b)
{
return a + b;
}
//定義一個沒有返回值的方法
public static void over(double a, int b)
{
Console.WriteLine("結果爲:" + (a + b));
}
}
匿名方法
class Program
{
//1、聲明一個委託
delegate int Mydel(int a, int b);
static void Main(string[] args)
{
//2、定義一個匿名方法
Mydel m = delegate (int a, int b)
{
return a + b;
};
//3、調用匿名方法
int result = m(1, 1);
Console.WriteLine(result);
}
}
lambda表達式
class Program
{
//1、聲明一個委託
delegate int Mydel(int a, int b);
static void Main(string[] args)
{
//2、Lambda表達式,大家發現沒有,代碼一個比一個簡潔
Mydel m = (a, b) => a + b;
//3、調用方法
int result = m(1, 1);
Console.WriteLine(result);
}
}
class Program
{
//定義一個委託
public delegate int mydel(int a);
static void Main(string[] args)
{
//調用當前委託
int result = add(a => 10 + a, 10);
Console.WriteLine(result);
Console.WriteLine(add(a=>10-a,11));
}
//定義方法,參數爲自定義委託和一個整型,返回值爲自定義委託的返回值
public static int add(mydel m,int a)
{
return m(a);
}
}
大家有沒有發現,從委託到匿名方法再到lambda表達式,代碼一個比一個簡潔了,Lambda表達式的本質是“匿名方法”,即當編譯我們的程序代碼時,“編譯器”會自動將“Lambda表達式”轉換爲“匿名方法”
Lambda表達式的語法結構:
參數列表=>語句塊
其中的參數列表可以包含多個參數(與委託參數列表一致),0個和1個以上參數需要用括號括起來,例如:
()=>Console.WriteLine("表示有0個參數");
x=>Console.WriteLine("表示有一個參數爲{0}",x);
(x,y)=>Console.WriteLine("表示有兩個參數爲:{0}、{1}",x,y);
語句塊中有多條語句需要用大括號括起來,例如:
x=>{x++;return x;}