数据持久化[委托、隐式类型与匿名类型、扩展与yield关键字、Lambda表达式]

委托:是一种引用类型,表示具有特定参数列表和返回类型 的方法引用,可以将其实例与任何具有兼容签名和返回类型的方法相关联,可以通过委托实例调用方法

委托声明:public delegate 返回类型  委托名  参数列表;   //delegate声明委托的关键字

委托实例化:委托是一种特殊的类,需要使用new实例化委托,可以指向一个具有相同标签的方法

语法: 委托名  定义一个委托对象名=new 委托名(被委的托方法); //使用委托将方法作为参数传递                                                                                                                                                                               eg:   public delegate string TranslationDelegate (string s);                                                                       TranslationDelegate  transform=new TranslationDelegate(被委的托方法);                                       简写版:TranslationDelegate  transform=被委的托方法;

调用委托:委托对象  invoke();

注:指向的方法需要符合委托所定义的方法签名和返回类型

多播委托:通过使用“+”运算符将多个对象分配到一个委托实例上,包含已分配的委托列表,因此多播委托被调用时会依次调用列表中的委托,仅可合并类型相同的委托,使用“-”运算符可以从多播委托中删除组件委托

隐式类型与匿名类型:声明的变量可以使用隐式类型,将普通变量声明中的数据类型名称替换为var

语法:var  变量=初始值                                                                                                                                 注:变量必须初始化,声明变量推断出类型后,变量的类型不能改改变                               

匿名类型:可用来将 一组只读属性封装到单个对象中,无需显示定义一个类型,类型名由编译器生成,不能在源代码级使用,每个属性类型由编译器推断,可通过使用new运算符和对象初始值创建匿名类型

匿名类:其本质和普通定义的类一样,只不过是由系统的编译器完成命名的                                                    注:属性类型和顺序一致可以共同使用一个匿名类

匿名方法 :委托是用于引用与其具有相同标签的方法,可以使用委托对象调用可由委托引用的方法,匿名方法没有名称只有主体,代码块作为委托参数的技术,不需要指定返回类型(得从方法主体内的return推测)                                                                                                                                              注:  匿名方法不声明返回值类型,但方法返回值类型和委托返回值类型一致                                          在参数方面:参数数量、类型和修饰符必须和委托一样

C#扩展方法:使编码人员能够向现有类型添加方法,无需创建新的派生类型,重新编译或以其他方式修改原始类型

C#扩展方法介绍:是一种特殊的静态方法,允许使用实例方法的调用来调用静态方法,至少有一个参数,第一个参数指定该方法作用于哪种类型,且该参数以this修饰符作为前缀,不能破坏面向对象封装概念,只能访问所扩展的public成员。                                                                                                    注:  定义C#扩展方法是静态类 ,扩展方法是静态方法,第一个参数前加上this                                      代码中调用添加using指令(用于指定包含的扩展方法的类和命名空间)

yield:向编译器指示该关键字所在的方法是迭代器块,编译器将生成一个类来实现迭代器块中所表示的行为,yield关键字与return关键字结合使用表示向枚举器对象提供返回值,yield关键字与break结合使用表示迭代结束                                                                                                                                        注:  如果yield关键出现的方法、运算符或get访问器则是迭代器,可以实现自定义集合类型IEnumerator<T>和IEnumerable模式时无需使用其他显示类型

yield关键字的使用:使用foreach循环语句对List<T>集合进行循环遍历,将符合条件的数据返回                Eg:

                public class Goods{
                        //封装字段

                        public string GoodsName{get;set;}//商品名称  
                        public double GoodsPrice{get;set;}    //商品价格     

                                }

   public static IEnumerable<Goods> getList(List<Goods>list,double price){

                                foreach(var item in list){

                                 if(item.GoodsPrice==price){

                                  yield return item;

                                        }

                                }

                        }

         

       static void Main(string[] args){

                        List<Goods> goodsInfoList=new List<Goods>(){  

                          new Goods(){ GoodsName="薯条",GoodsPrice=6 },  
                          new Goods(){ GoodsName="可乐",GoodsPrice=4 },
                          new Goods(){ GoodsName="汉堡",GoodsPrice=23 }

                        };

           var obj=getList(goodsInfoList,4)//调用扩展方法getList,筛选出GoodsPrice=4

                 foreach (var item in obj){

      Console.WriteLine("商品名称:{0},商品价格{1}",item.GoodsName,item.GoodsPrice);

                        }

                } 

Lambda表达式:是一个匿名方法,可以表示闭包,结合Linq(语言集成查询)完成相关的查询工作

Lambda表达式语法:形参列表=>方法体                                                                                                                      注:形参列表(即参数),参数个数可以是0个、一个、多个等                                                               函数体多于一条语句用大括号括起来

采用传统方式:

public delegate void DelegateFun(string str);
public class Lambda{
   public void DelFun(string str){
       Console.WriteLine("你好:"+str);
  }
  public void GetSay(){
      DelegateFun myDelegate=new DelegateFun(DelFun);
      myDelegate("李四");
  }
}


static void Main(string[] args){
      Lambda lam=new Lambda();
      lam.GetSay();
      Console.ReadLine();
}

采用匿名方法:

public delegate void DelegateFun(string str);
public class Lambda{
    public void GetSay(){
        DelegateFun myDelegate=new DelegateFun((x)=>{
         Console.WriteLine("你好:"+x);
        });
        myDelegate("李四");
    }
}

 static void Main(stirng[] args){
    Lambda lam=new Lambda();
    lam.GetSay();
    Console.ReadLine();
}

采用匿名方法、泛型委托和Lambda表达式:

public class Lambda{
    public void GetSay(){
        new Action<string>((x)=>{
            Console.WriteLine("你好:"+x);
        })("李四");
    }
}

static void Main(string[] args){
  Lambda lam=new Lambda();
  lam.GetSay();
  Console.ReadLine(;
}

    注:泛型委托包含 Action(不带返回参数)、Func(带返回参数)和Predicate(返回bool类型)  此三种委托是mscorlib.dll程序集中定义好的                                                                                      .net内置服务基本格式  https://www.cnblogs.com/maitian-lf/p/3671782.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值