这个题目有点牵强,真不知道如何取一个比较中意的名称,写技术博客,我很少拘泥小节,但是注重细节,如果细节都出现问题了,那么这个博文也就失去了价值。
其实应该从委托说起,委托是C#中的一个重要的内容,记得在有关MVC博文的时候就提到过,委托可以将执行体分开,这样可以有效的解耦。我从过一个简单的示例说明下,比如要求一个加法的运算,我们就可以通过委托来实现
常常的做法是定义一个委托,声明一个委托变量,给委托变量绑定一个求加法的函数,也就是赋值,然后通过委托变量进行操作。
delegate int Add(int a, int b);
Add sdel;
static void Main(string[] args)
{
Program prm = new Program();
prm.sdel = GetAdd;
if (prm.sdel != null)
{
int res = prm.sdel(5, 6);
Console.WriteLine(res);
}
}
static int GetAdd(int x,int y)
{
return x + y;
}
我们可以得到正确的值。
现在来看匿名函数,从字面意思来看,就是一个没有名称的函数而已(我们过去对函数的定义,函数名,函数体等),而现在要说的函数是没有名字的,至少名字不是又我们给定的,那么对于上面的我们可以写成:
delegate int Add(int a, int b);
Add sdel;
static void Main(string[] args)
{
Program prm = new Program();
prm.sdel = delegate(int x, int y) { return x + y; };
int res = prm.sdel(8, 6);
Console.WriteLine(res);
}
prm.sdel = delegate(int x, int y) { return x + y; };
通过这种方式,我们可以不用写另外一个函数,就像上面提到的GetAdd,代码减少了不少。
接着看lambda表示,lambda表达式其实就是一个匿名函数,只不过它有自己的语法,当然不仅仅如此,其结构也很清晰,看下面的代码
delegate int Add(int a, int b);
Add sdel;
static void Main(string[] args)
{
Program prm = new Program();
prm.sdel = (x, y) => x + y;
int res = prm.sdel(8, 6);
Console.WriteLine(res);
}
}
上面的写法,也实现了我们求和的目的,但是代码量大大减少。
现在看下题目,其实这是一个有着发展史的顺序的,发展史可能有点过了,暂且就这么用吧,匿名函数是演变为lambda的,看看NET的发展史就可以清楚了,这里就不罗嗦了,其余的思考空间留给读者吧。