Lambda演变

.lambda表达式究竟是什么?---就是一个匿名函数---在底层会生成在一个"<>"类中,生成带有名称的方法;  

lambda   语法糖: 借了委托的壳而已,执行的是方法,本质是一个函数。并不是委托

Lambda 演化


public delegate void NoReturnNoPara();
public delegate void NoReturnWithPara(int x, string y);//1 声明委托
public delegate int WithReturnNoPara();
public delegate string WithReturnWithPara(out int x, ref int y);

 

      
{
//.Netframework1.0/1.1时代 int j = 0; NoReturnNoPara method = new NoReturnNoPara(DoNothing); NoReturnWithPara method1 = new NoReturnWithPara(Study); method1.Invoke(123, "Richard"); } ///.NetFramework2.0 匿名方法 增加了一个delegate关键字,可以访问到除了参数以外的局部变量 int i = 0; { NoReturnWithPara method = new NoReturnWithPara(delegate (int x, string y) { Console.WriteLine(x); Console.WriteLine(y); Console.WriteLine(i); }); } .NetFramework3.0 去掉delegate关键了,在参数的后增加了一个 => goes to { NoReturnWithPara method = new NoReturnWithPara((int x, string y) => { Console.WriteLine(x); Console.WriteLine(y); Console.WriteLine(i); }); } { //.NetFramework3.0 后期,去掉了匿名方法红的参数类型--为什么可以去掉? 语法糖:编译器提供的便捷功能;可以推导出类型的参数 NoReturnWithPara method = new NoReturnWithPara((x, y) => { Console.WriteLine(x); Console.WriteLine(y); Console.WriteLine(i); }); } { //如果匿名方法体中只有一行代码,可以省略方法体的大括号; NoReturnWithPara method = new NoReturnWithPara((x, y) => Console.WriteLine(x)); NoReturnWithPara method1 = (x, y) => Console.WriteLine(x); NoReturnWithPara method2 = (x, y) => global::System.Console.WriteLine(x); } { 一个参数的时候;如果只有一个参数-- - 参数的小括号也可以省略掉 Action<string> method = s => Console.WriteLine("欢迎大家来到.Net高级班进阶学习"); method.Invoke("牧羊人。。"); }
////如果有返回值? 如果lambda表达式中只有一行代码,且有返回值,可以省略return;

                Func<string> func1 = new Func<string>(() =>
                {
                    return "";
                });

                Func<string> func2 = () =>
                {
                    return "";
                };
                Func<string> func3 = () => "";

匿名类演变

  Student student = new Student()
                    {
                        Id = 1,
                        Name = "Nochat",
                        Age = 25,
                        ClassId = 2
                    };
                    student.Study();
 object model = new//3.0    
                    {
                        Id = 1,
                        Name = "Nochat",
                        Age = 25,
                        ClassId = 2
                    }; 

                    //无法访问属性值
                    // Console.WriteLine(model.Id); //为什么?因为C#是强类型语言,object是在编译时确定类型; 因为Object没有这个属性; 
                    //Console.WriteLine(model.Name);
//dynamic避开编译器检查 (4.0)  .NETFramework
                    //(动态类型),可以避开编译器的检查
                    dynamic dModel = new//  dynamic可以便可编译器的检查,运行时检查
                    {
                        Id = 1,
                        Name = "Nochat",
                        Age = 25,
                        ClassId = 2
                    };
                 
                    dModel.Id = 134;

                   // dModel.abccc = 1234; //也不报错了---实例中其实是没有这个属性的;
//var 语法糖   可以理解为弱类型;不确定类型;
                    Console.WriteLine("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
                    var model1 = new //1.不能声明方法 2.不能给属性重新赋值  只能在初始化的时候,给定一个值;
                    {
                        Id = 1,
                        Name = "Nochat",
                        Age = 25,
                        ClassId = 2
                    };
 Console.WriteLine(model1.Id); //var 定义的匿名类,可以访问存在的属性值;
                    Console.WriteLine(model1.Name);
                      //Console.WriteLine(model1.Js); 
                     // model1.Id = 3; // 属性是只读,不能设置值;


                    Console.WriteLine("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
                    int i2 = 2;
                    var i1 = 1;//var就是个语法糖,由编译器自动推算  
                    var s = "Richard";

                     
                    //var strnull = null; //编译器不允许; 
                    // var aa;//var声明的变量必须初始化,必须能推算出类型
                    //也不允许作为方法的参数类型 
                    ////1 var 配合匿名类型使用
                    ////2 var 偷懒,复杂类型的使用 
                    ////3 在不知道具体是什么类型的时候就可以使用var 来声明; 
                    //缺陷:个人认为,在代码阅读的时候不是很方便;
                    //建议大家在写代码的时候,尽量明确类型; 

 

posted @ 2021-11-27 17:06  wolfsocket  阅读(34)  评论(0编辑  收藏  举报