委托的记忆碎片

1、委托


定义:定义委托就是定义一类方法的类型,方法类型分类原则是根据参数和返回值的不同来分类的。
什么!你说方法分类还考虑返回值的类型吗?方法的重载可不会考虑方法的返回值的不同,只看方法的参数列表的啊。
是的,方法重载中的方法区分的方法是不看返回值的,但是定义委托是看方法返回值的。
例如:两个int参数返回一个Boolean,这就可以用委托定义一类方法,c#的表达式:

public delegate bool MyDelegate(int i,int j);


这时候MyDelegate就是指有两个int参数,bool返回值的方法类型,他的实类就是一个包含两个int参数,bool返回值的方法。
当委托作为方法的参数使用时,直接使用实例的方法名,如:

public void BobbSort(int[] list, MyDelegate de)
{
   //方法体
}

Main()
{
     //注意methodName就是一个有两个int参数,返回值为bool的方法名
     BobbSort(list,methodName);
}


这里要说明一下,从以前调用方法的经验来看,这边的委托方法实例调用是有区别的,并并没有方法的参数列表。


2、匿名方法


定义:没有实际方法声明的委托实例。
这句话的意思是:是一个委托实例,而委托实例是一个方法,是一个没有没有实际方法声明的方法,其实方法的定义没有一个方法名称而是直接放回给一个委托。如:

MyDelete mydelegate;
mydelegate = delegate(int first,int second)
{
     return first < second;
};


3、C#3.0引入了Lampda表达式

比匿名方法更加简洁的一种匿名函数语法。这里的匿名函数泛指Lambda表达式和匿名方法,其中Lambda表达式分成表达式Lambda和语句Lambda。
语句Lambda:

(int first,int second)=>
{
    return first < second;
}


匿名方法:

delegate(int first,int second)
{
    return first < second;
}


以上的两段的代码功能一样。其实都是一个没有方法名的方法,但是可以直接赋值给这个类型的委托,成为一个委托实例。
语句Lambda还可以省略参数的类型:

(first,second)=>
{
    return first < second;
}


这是因为你把这个表达式赋值给一个委托后,而委托的类型是:

public delegate bool MyDelegate(int i,int j);


这样编译器会自己判断。
无参数的语句Lambda:

Func<string> getUserInput =
    ()=>
    {
        string input;
        do
        {
            input = console.ReadLine();
        }while(input.Trim().Length == 0);
       return input;
    }


圆括号规则例外,当编译器能推断数据类型,而且只有一个输入参数,语句Lambda可以不带圆括号:


process=>{return process.ToString();}


表达式Lambda:就是只有一个表达式,没有语句块。如:

(f,s)=>f<s;


就是没有return语句及大括号,其实这个表达式本身就是一个返回语句。

原文地址:https://www.cnblogs.com/lmfeng/p/2242511.html