C#中匿名函数、委托delegate和Action、Func、Expression、还有Lambda的涉嫌和区分

匿名函数

匿名函数总是和寄托一齐使用,因为匿名函数方便了寄托的行使(不用声美赞臣(Meadjohnson)个类了)

下边已经讲到匿名函数了。函数和措施等价,用来封装1段代码片以便随时使用,有的有重回值有的无重临值。写在类里面。

信托基本的应用包涵扬言一个信托、实例化三个寄托、使用贰个寄托

Lambda表达式

寄托很好用。当编制程序到自然等第,发现只传递1个或多少个int、strig类型参数是不够的,希望能够把1段代码举行传递来进行有些操作,委托提供了那般的路子,委托提供了1种能够直接待上访问类中艺术的路子,能够将艺术当作叁个参数字传送递从而选拔

使用Lambda表达式:

 

        public delegate void Seep();
        static void Main(string[] args)
        {
            Seep see = delegate () { Console.WriteLine(1); };
        }
// 声明一个委托,类型是myDelegate,
public delegate void myDelegate(string str); 
public static void HellowChinese(string strChinese) 
{ 
    Console.WriteLine("Good morning," + strChinese); 
    Console.ReadLine(); 
} 
// 实例化   
myDelegate d = new myDelegate(HellowChinese); 
// 使用
d("Mr wang");

信托必要先声美赞臣个门类本领动用,这很艰辛,比如本身在某1个命名空间证明了1个尚未重回值的委托myDelegate,然后想要这几个委托的时候,种种命名空间都要引用这一个命名空间,那太不友好了。

二、Lambda表达式只可以有一条语句。

Linq表明式用于离线集合的查询。什么是离线集合?最常用的是EF里面包车型客车DBContext,小编也只用过这些,所以本人不想那么多,就把Expression当成EF里面使用的就行了。

 

Expression指的是System.Linq.Expressions,是Linq表明式,表明式树,不是Lambda表明式!!

            #region 无参数无返回值
            // lambda实现委托实例
            Action a1 = () => Console.WriteLine(1);
            a1();
            // delegate实现委托实例,下面不再演示delegate。
            Action a2 = delegate { Console.WriteLine(1); };
            a2();
            #endregion

            #region 有参数无返回值
            Action<int> a3 = (x) => Console.WriteLine(x);
            a3(1);
            #endregion

            #region 无参数有返回值的情况
            Func<int> e1= ()=> 1;
            var value1= e1();
            #endregion

            #region 有参数有返回值的情况
            // 最后一个泛型是返回值的类型
            Func<int,int> e2 = (x) => x+1;
            int value2= e2(1);
            // 多参数情况
            Func<int, int,int> e3 = (x,x2) => x+x2 + 1;
            int value3 = e3(1,2);
            #endregion

            #region 返回值是布尔类型
            // 其实Predicate可以用Func返回值是bool来代替的。
            Predicate<int> p = (x) => x > 0;
            bool value4 = p(1);
            #endregion

1部分文书档案上写Lambda是匿名函数,作者以为是颠三倒肆的,拉姆da能够代表二个匿名函数,可是还足以来代表Linq表明式啊。

图片 1

可是若是自个儿只想把那段代码片使用2回啊?再声称2个类、3个办法其实太麻烦,那时候匿名函数就全部了价值。用来封装壹段代码、直接实施可能传递。

地点已经经过匿名函数完毕了不要注脚类,以后经过C#预约义的信托项目达成了不用证明委托项目,那么未来就足以一直写代码片来试行了

总结

一、皆以梦想能够单独引用1段代码片引起的。
贰、然后引用了寄托delegate,delegate的运用方法为证明类型-实例化类型(传入想要使用的类的点子)-使用委托(使用办法)
三、简化操作,使用(通过Lambda可能delegate)匿名格局来直接声美赞臣(Meadjohnson)段代码片,防止证明所想使用的类的章程
肆、简化操作,直接使用C#预定义的二种委托Action、Func、Predicate,连表明委托都省了。
5、本文代码:https://github.com/Beiluola/delegateDemo

信托还有局地特性(如可加性),感兴趣的能够查阅相关资料。

那三种委托的对应泛型方式,能够写出如下代码:

动用委托

Action、Func、Predicate

            Expression<Func<int,int>> eeee = (x)=> x+ 1 ;

微软一贯就在框架中概念了三种委托:Action、Func、Predicate。这三种委托是C#的System命名空间中早就定义好的,如Action

Expression

Lamda表明式基本写法是()=>{ };
拉姆da和方式同样都可以流传参数和装有重回值。(int x)=>{return x;};
Lambda表达式并不是C#独有的,别的语言也有所拉姆da表明式。

在此之前向来迷迷糊糊的,以往好不轻易搞精晓。

注意

一、匿名函数总是和委托一起使用(三种预订义委托)
二、使用二种预约义委托就能够满意大大多要求。
三、Expression是Linq表达式树,只可以动用接受一句lambda表明式。和匿名函数无关。

1、只可以承受Lambda表达式表示的嘱托

        public delegate void Seep();
        static void Main(string[] args)
        {

            Seep s = () => { Console.WriteLine(2); Console.WriteLine(1); };
        }

delegate委托

匿名格局三种完毕情势:

相关文章