zoukankan      html  css  js  c++  java
  • [代码]--C#action和func的使用

    以前我都是通过定义一个delegate来写委托的,但是最近看一些外国人写的源码都是用action和func方式来写,当时感觉对这很陌生所以看起源码也觉得陌生,所以我就花费时间来学习下这两种方式,然后发现确实代码简洁了不少。这两种方式我们也可以去实践的过程去慢慢运用。

    先说一下委托
    模拟一下场景:小明最近学习情绪高涨,以前买的书已经满足不了欲望,打算去买本(一个程序员的自我修养)。可是呢以前总是跑书厂买,nm,太远了扛不住,就去跑去附近书店去买,小明去给钱就弄了一本书回来,这个过程就是委托。开始分析
    1:小明要买一本一个程序员自我修养的书籍(xx书就不买)硬性要求 (这就是要定义委托性质)
    代码:

     private delegate void BuyBook();

    2:附近书店 (委托的方法)
    代码:

    public static void Book()
    {
        Console.WriteLine("我是提供书籍的");
    }

    3:小明和书店建立关系(给委托绑定方法)
    代码:

    BuyBook buybook = new BuyBook(Book);

    4:小明给钱拿书(触发)

    buybook();

    上面的内容是为了能理解委托的用法下面呢我开始讲解Action和Func

    Action的用法
    1:小明很是苦恼,我就是买一本书籍,每次都让我定义下,烦死了,有没有一种方法不去定义委托呢,那么有吗,还真有,就是我们今天讲的Action

    Action BookAction = new Action(Book);
    BookAction();

    这样是不是就简单了很多
    2:小明现在又不满意了,我把一个程序员的自我修养看完了,现在呢想买本其他书,那怎么办,我是不是要重新再次定义委托。其实不需要你只需要把参数穿过来就可以了。下面我们看Action<T>的用法

    static void Main(string[] args)
    {
         Action<string> BookAction = new Action<string>(Book);
         BookAction("百年孤独");
    }
    public static void Book(string BookName)
    {
         Console.WriteLine("我是买书的是:{0}",BookName);
    }

    3:现在小明又改变主意了,我不仅要自己选择书籍,我还要在一个牛逼的书籍厂家买,有没有这种方式呢,那么告诉你有

    Action<in T1,in T2>static void Main(string[] args)
    { Action<string,string> BookAction = new Action<string,string>(Book); BookAction("百年孤独","北京大书店"); } public static void Book(string BookName,string ChangJia) { Console.WriteLine("我是买书的是:{0}来自{1}",BookName,ChangJia); }

     
    Func的用法
    小明又发生疑问了,每次我自己都去书店去拿书,有没有一种方法直接送到我家里呢,那么Func专门提供了这样的服务
    Func 解释 封装一个不定具有参数(也许没有)但却返回 TResult 参数指定的类型值的方法。
    1:我们先看一个没有参数只有返回值的方法

    static void Main(string[] args)
    {
         Func<string> RetBook = new Func<string>(FuncBook);
         Console.WriteLine(RetBook);
    }
    public static string FuncBook()
    {
         return "送书来了";
    }

    2:有参数有返回值的方法

    static void Main(string[] args)
    {
        Func<string,string> RetBook = new Func<string,string>(FuncBook);
        Console.WriteLine(RetBook("aaa"));
    }
    public static string FuncBook(string BookName)
    {
        return BookName;
    }

    3:Func一个很重要的用处就是传递值,下面我举一个简单的代码来说明

    Func<string> funcValue = delegate
    {
          return "我是即将传递的值3";
    };
    DisPlayValue(funcValue);

    注释1:DisplayVaue是处理传来的值,比喻缓存的处理,或者统一添加数据库等

    private static void DisPlayValue(Func<string> func)
    {
         string RetFunc = func();
         Console.WriteLine("我在测试一下传过来值:{0}",RetFunc);
    }

    总结

    1:Action用于没有返回值的方法(参数可以根据自己情况进行传递)

    2:Func恰恰相反用于有返回值的方法(同样参数根据自己情况情况)

    3:记住无返回就用action,有返回就用Func

    原地址:https://www.cnblogs.com/xuxiaoshuan/p/6844511.html

  • 相关阅读:
    matplotlib数据可视化之柱形图
    xpath排坑记
    Leetcode 100. 相同的树
    Leetcode 173. 二叉搜索树迭代器
    Leetcode 199. 二叉树的右视图
    Leetcode 102. 二叉树的层次遍历
    Leetcode 96. 不同的二叉搜索树
    Leetcode 700. 二叉搜索树中的搜索
    Leetcode 2. Add Two Numbers
    Leetcode 235. Lowest Common Ancestor of a Binary Search Tree
  • 原文地址:https://www.cnblogs.com/girliswater/p/9443632.html
Copyright © 2011-2022 走看看