委托,匿名方法,Lambda 表达式 的关系
- 相关概念:
- 如何使用:
- 三者间的关系:
相关概念:
什么是委托?
关于委托是什么及如何使用,网上及博客园里有很多相关介绍, 这里我不再赘述。委托是一种引用方法的类型(MSDN)。
什么是匿名方法?
我理解为是委托的一种实现方式,也是一种匿名函数。区别于正式签名方法,匿名方法不必创建单独的方法,减少了实例化委托所需的编码系统开销(MSDN)。
什么是 Lambda 表达式:
其实质上是一个匿名函数(MSDN)
如何使用:
相关使用方法已在相关 MSDN 上有介绍,这里我贴一段 冒泡排序算法的实现代码,相关使用方法在注释里()。
冒泡排序
//声明委托
delegate string getText(int[] arr);
private void dowork() {
//使用匿名方法
getText toString = delegate(int[] arr)
{
string result = "";
//int temp = 0;
foreach (var i in arr)
{
result += string.Format("{0} ,", i);
}
return result;
};
// lambda 表达式
getText Sort = (int[] arr) => {
string result = "";
for (int i = 1; i < arr.Length; i++) {
if (arr[i - 1] > arr[i])
{
int temp = arr[i-1];
arr[i - 1] = arr[i];
arr[i] = temp;
}
}
//使用匿名方法
result = toString(arr);
return result;
};
int[] arrInt = { 2, 1, 8, 6, 7, 12 };
string text = toString(arrInt) + "\r\n" + Sort(arrInt); ;
tbdebug.Text += text;
}
delegate string getText(int[] arr);
private void dowork() {
//使用匿名方法
getText toString = delegate(int[] arr)
{
string result = "";
//int temp = 0;
foreach (var i in arr)
{
result += string.Format("{0} ,", i);
}
return result;
};
// lambda 表达式
getText Sort = (int[] arr) => {
string result = "";
for (int i = 1; i < arr.Length; i++) {
if (arr[i - 1] > arr[i])
{
int temp = arr[i-1];
arr[i - 1] = arr[i];
arr[i] = temp;
}
}
//使用匿名方法
result = toString(arr);
return result;
};
int[] arrInt = { 2, 1, 8, 6, 7, 12 };
string text = toString(arrInt) + "\r\n" + Sort(arrInt); ;
tbdebug.Text += text;
}
三者之间的关系:
从相关概念及使用方法上我们可以看出:匿名方法, Lambda表达式 都是匿名函数,均可作为委托的一种实现方式。
------------------------------ 分割线 2010-6-29 ------------------------------
补充:在 .net 2.0 中及以后出现了 System.Action 和 System.Func 两个委托,可以部分地替代我们需要显式声明委托。两者用法相似,但其区别是: Action 不需要返回值, Func 则需要返回指定的类型值。
如:
public static void Main()
{
Func<int,int> cal = Square;
Console.Write("the result of {0} is {1}", 10, cal(10));
/***** 结合 Lambda 表达式 *****/
Func<int, int> cals = (int s) =>{ return s+10 ;}
Console.Write("the result of {0} is {1}", 10, cals(5));
}
private static int Square(int size)
{
return size*size;
}
{
Func<int,int> cal = Square;
Console.Write("the result of {0} is {1}", 10, cal(10));
/***** 结合 Lambda 表达式 *****/
Func<int, int> cals = (int s) =>{ return s+10 ;}
Console.Write("the result of {0} is {1}", 10, cals(5));
}
private static int Square(int size)
{
return size*size;
}