Lambda表达式并不是C

先前向来迷迷糊糊的,未来终于搞明白。

Lambda表达式

Lamda表明式基本写法是()=>{ };
Lambda和形式同样都能够流传参数和具有重临值。(int x)=>{return x;};
拉姆da表明式并不是C#澳门太陽城集团登录网址,唯有的,另外语言也是有着Lambda表达式。

澳门太阳集团城网址,一部分文书档案上写Lambda是无名函数,作者以为是颠三倒四的,Lambda能够象征一个无名函数,可是还足以来代表Linq表明式啊。

delegate委托

寄托基本的施用富含声称二个寄托、实例化三个寄托、使用贰个委托

// 声明一个委托,类型是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");

委托很好用。当编制程序到一定品级,发掘只传递二个或几个int、strig类型参数是远远不足的,希望得以把一段代码进行传递来实施某些操作,委托提供了那般的不二等秘书籍,信托提供了一种能够一贯访问类中艺术的门道,能够将艺术当作二个参数字传送递进而选取

无名氏函数

地点已经讲到无名函数了。函数和方法等价,用来封装一段代码片以便随时使用,有的有再次回到值有的无重返值。写在类里面。

Lambda表达式并不是C。不过借使自个儿只想把这段代码片使用三次啊?再声称一个类、叁个主意其实太麻烦,那时候无名氏函数就具有了股票总值。用来封装一段代码、间接试行也许传递。

Lambda表达式并不是C。无名函数总是和寄托一同使用Lambda表达式并不是C。,因为无名函数方便了信托的利用(不用声可瑞康(Karicare)(Nutrilon)个类了)

Lambda表达式并不是C。无名格局二种达成情势:

使用Lambda表达式:

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

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

接纳委托

 

        public delegate void Seep();
        static void Main(string[] args)
        {
            Seep see = delegate () { Console.WriteLine(1); };
        }

 

Action、Func、Predicate

信托需求先声美素佳儿个类型技术应用,那很麻烦,比方本人在某一个命名空间申明了一个从未再次来到值的委托myDelegate,然后想要这一个委托的时候,各种命名空间都要援引那些命名空间,那太不友好了。

微软直接就在框架中Lambda表达式并不是C。Lambda表达式并不是C。概念了二种委托:Action、Func、Predicate。那二种委托是C#的System命名空间中早就定义好的,如Action

澳门太阳集团城网址 1

地点已经因而匿名函数完结了不用注脚类,未来通过C#预订义的寄托项目完毕了不用申明委托项目,那么现在就可以一向写代码片来实践了

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

            #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

寄托还恐怕有一部分特征(如可加性),感兴趣的能够查看有关材质。

Expression

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

Linq表明式用于离线集合的询问。什么是离线会集?最常用的是EF里面包车型地铁DBContext,笔者也只用过那些,所以笔者不想那么多,就把Expression当成EF里面使用的就行了。

1、只可以承受Lambda表明式表示的寄托

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

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

总结

1、都以梦想能够独立引用一段代码片引起的。
2、然后援用了委托delegate,delegate的应用办法为申明类型-实例化类型(传入想要使用的类的章程)-使用委托(使用方法)
3、简化操作,使用(通过Lambda或然delegate)无名格局来向来声澳优段代码片,制止申明所想使用的类的法子
4、简化操作,直接使用C#预订义的两种委托Action、Func、Predicate,连申明委托都省了。
5、本文代码:

注意

1、无名氏函数总是和寄托一齐利用(三种预订义委托)
2、使用二种预订义委托就足以满意大大多急需。
3、Expression是Linq说明式树,只好动用接受一句lambda表达式。和佚名函数无关。

You may also like...

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图