zoukankan      html  css  js  c++  java
  • Func<T>,Action<T>,Predicate<T>使用小结


    一、基本知识
    1.这三个都是.Net内置的泛型委托,方便我们直接使用,而不需要在使用委托时还要做如下定义

    public delegate string GetName(string bookId);

    2.Func<T>是有返回值的泛型委托,格式为Func<T1,T2,T..N,TResult>,T1,T2,T..N为多个参数,TResult为返回值

    3.Ation<T>是没有返回值的泛型委托,格式为Action<T1,T2,T..N>,T1,T2,T..N为多个参数

    4.Predicate<T>是返回值为Bool的泛型委托,相当于Func<T,bool>,主要用于校验,检查等

    二、使用理解
    泛型委托的使用,和抽像类的抽象方法有异曲同工之妙,即将业务变化的实现部分抽离到外部,内部程序主体框架保持不变,做到方法注入,属性注入
    配合匿名方法的使用,可进一步使外部的实现部分也变得非常简洁,在Linq的扩展方法有大量使用

    例如:有一个判断单号合法的方法(除了判断,还要写LOG,计数等),因为每种单据不同,判断逻辑也是不一样的,演示方法注入

    //方法定义
    public static bool CheckOrderNo(Func<string, bool> fun, string orderNo)
    {
        bool re = fun(orderNo);
        //TODO:Log
        //TODO:Count
        return re;
    }
    
    //使用匿名方法
    //判断是否为AA单(长度为10,首字母为"AA"
    var result= CheckOrderNo(x => x.Length == 10 && x.Substring(0, 2).ToUpper().Equals("AA"), "AB126552DFD15");
    
    //判断是否为AD单(长度为16,6~10字母为"ADGH")
    var result= CheckOrderNo(x => x.Length == 16 && x.Substring(5, 4).ToUpper().Equals("ADGH"), "AB126ADGH552DFD");
    
    
    //使用普通做法
    public bool CheckAAOrderNo(string orderNo)
    {
        return orderNo.Length == 10 && orderNo.Substring(0, 2).ToUpper().Equals("AA")
    }
    var result= CheckOrderNo(CheckAAOrderNo, "AB126552DFD15");
  • 相关阅读:
    spark streaming 程序设置jvm参数
    Continuously INFO JobScheduler:59
    No partition metadata for topic test due to kafka.common.LeaderNotAvailableException
    spark 免密码登录- ssh 指定非22端口
    jvm中的新生代Eden和survivor区
    Swift之控件-UIlabel
    UITextField的placeholder文字的位置,颜色等的自定义设置
    版本更新
    CFBundleVersion与CFBundleShortVersionString,上架注意事项
    上拉刷新,下拉加载
  • 原文地址:https://www.cnblogs.com/berlin/p/6062193.html
Copyright © 2011-2022 走看看