c# 匿名方法与Lambda 表达式的使用

c#中的委托

在搞清楚什么是匿名方法之前,需要弄明白什么是委托,c#中的委托相当于c语言中的函数指针,这个指针指向的内容(即函数)是可以发生变化的,下面举出一个实例说明。

delegate int my(int a,int b);
//我们定义了一个委托类型——my,相当于一个函数指针的模板,注意此时只是模板,还没有实例化
class test
{
    static int add(int a,int b)
    {
        return a + b;
    }
    static void  Main()
    {

        
        my n = new my(add);
        Console.WriteLine(n(1, 2));
    }
}

执行结果:

        控制台打印1+2的和,即3

在main方法中,my n = new my(add);这一句,我们实例化了一个my类型的对象,并取名叫n,让其指向add方法(可以类比c语言,即让指针指向一个函数,这个函数就是add),接下来,我们就可以用这个引用n来执行add的功能。

注意:add在上例中定义为静态,是为了避免再实例化一个对象,再调用其方法(注意模板和实例对象的区别)。

匿名方法

可以看到,在委托中,我们需要写出一个完整的方法(在上图中就是add方法),不仅要给方法起个名字(add),还得写返回值类型(int),以及两个参数(int a,int b。再来让引用指向这个方法,显得复杂。为了简单,能不能直接写这个函数的主体,而省略上面的步骤呢?

         于是,匿名方法来了。

delegate int my(int a,int b);
class test
{
    static void  Main()
    {

        my m = delegate (int a, int b)
        {
            return a+b;
        };
        Console.WriteLine( m(1,2));
    }
}

        

执行结果:

        控制台打印1+2的和,即3

      与上图的代码进行比较,同样是委托,这里我没有定义方法add,而是直接用delegate关键字创建一个委托实例,这样就不用再声明一个方法add,而达到了同样的效果。再结合匿名方法的名字,匿名代表方法的名字没有定义,只有方法的主体。

Lambda 表达式

Lambda 表达式被用来进一步简化委托的使用。

delegate int my(int a,int b);
class test
{
    static int add(int a,int b)
    {
        return a + b;
    }
    static void  Main()
    {
        my func = (p, q) =>
        {
            return p+q;
        };
        Console.WriteLine(func(1,2));
    }
}

执行结果:

        控制台打印1+2的和,即3

这下我们连delegate关键字都不用了,直接让=>前面的(p,q)作为参数,p对应int a,q对应int b,中括号里面的就是函数主体。

注意:如果只有一个参数,()可以省略,同样,方法主体的语句只有一句,{}也可以省略。

猜你喜欢

转载自blog.csdn.net/qq_16198739/article/details/126994297