zoukankan      html  css  js  c++  java
  • 委托

    转载自:http://www.cnblogs.com/LipeiNet/p/4694225.html

          http://www.cnblogs.com/akwwl/p/3232679.html

    在C#委托现在有4种方式,分别是 delegate、Action、Func、Predicate

    模拟一下场景:小明最近学习情绪高涨,以前买的书已经满足不了欲望,打算去买本(一个程序员的自我修养)。可是呢以前总是跑书厂买,nm,太远了扛不住,就去跑去附近书店去买,小明去给钱就弄了一本书回来,这个过程就是委托。 

    1、delegate  注:Delegate至少0个参数,至多32个参数,可以无返回值,也可以指定返回值类型。

        class Program
        {
            //① 小明要买一本一个程序员自我修养的书籍(xx书就不买)硬性要求 (这就是要定义委托性质)
            private delegate void BuyBook();
    
            static void Main(string[] args)
            {
                //③ 小明和书店建立关系(给委托绑定方法) 
                var buybook = new BuyBook(Book);
                //④ 小明给钱拿书(触发)
                buybook();
                Console.ReadLine();
            }
            //② 附近书店 (委托的方法)
            public static void Book()
            {
                Console.WriteLine("我是提供书籍的");
            }
        }

    2、Action 注:Action至少0个参数,至多16个参数,无返回值。

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

    var bookAction = new Action(Book);
    bookAction();

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

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

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

        class Program
        {
            static void Main(string[] args)
            {
                var bookAction = new Action<string, string>(Book);
                bookAction("百年孤独", "北京大书店");
                Console.ReadLine();
            }
    
            public static void Book(string bookName, string changJia)
            {
                Console.WriteLine("我是买书的是:{0}来自{1}", bookName, changJia);
            }
        }

    3、Func 注:Func至少0个参数,至多16个参数,根据返回值泛型返回。必须有返回值,不可void

    小明又发生疑问了,每次我自己都去书店去拿书,有没有一种方法直接送到我家里呢,那么Func专门提供了这样的服务

    Func 解释 封装一个不定具有参数(也许没有)但却返回 TResult 参数指定的类型值的方法。

    ① 我们先看一个没有参数只有返回值的方法

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

    ② 有参数有返回值的方法

        class Program
        {
            static void Main(string[] args)
            {
                var retBook = new Func<string,string>(FuncBook);
                Console.WriteLine(retBook("送你一本岛上书店"));
                Console.ReadLine();
            }
    
            public static string FuncBook(string bookName)
            {
                return bookName;
            }
        }

    ③ 方法中使用委托返回值

        class Program
        {
            static void Main(string[] args)
            {
                //方式1
                Func<string> funcValue = () => "我是即将传递的值3";
                DisPlayValue(funcValue); 
                //方式2
                DisPlayValue(() => "我是即将传递的值5");
                Console.ReadLine();
            }
    
            private static void DisPlayValue(Func<string> func)
            {
                var retFunc = func();
                Console.WriteLine("我在测试一下传过来值:{0}", retFunc);
            }
        }

    4、Predicate(谓词) 注:Predicate有且只有一个参数,返回值固定为bool

    using System.Drawing;
    
    class Program
        {
            static void Main(string[] args)
            {
                Point[] points = { new Point(100, 200), 
                new Point(150, 250), new Point(250, 375), 
                new Point(275, 395), new Point(295, 450) };
                Point first = Array.Find(points, ProductGT10);
                Console.WriteLine("Found: X = {0}, Y = {1}", first.X, first.Y);
                Console.ReadLine();
            }
    
            private static bool ProductGT10(Point p)
            {
                if (p.X * p.Y > 100000)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
        }

    总结:

        Delegate至少0个参数,至多32个参数,可以无返回值,也可以指定返回值类型

      Func可以接受0个至16个传入参数,必须具有返回值

      Action可以接受0个至16个传入参数,无返回值

      Predicate只能接受一个传入参数,返回值为bool类型

     

  • 相关阅读:
    [原][诗]送幼儿园杨老师
    [原]由智能音箱被黑联想到。。。人类灭亡
    [转]VS中的路径宏 OutDir、ProjectDir、SolutionDir各种路径含义
    [原]globalmapper设置高程配色(globalmapper自定义配色方案)
    [原]JSON 字符串(值)做判断,比较 “string ”
    [转]使用 curl 发送 POST 请求的几种方式
    [转]c++多线程编程之pthread线程深入理解
    [转]c++ pthread 多线程简介
    Linux下ps -ef和ps aux的区别
    Java三种方式实现栈和队列
  • 原文地址:https://www.cnblogs.com/ideacore/p/6902510.html
Copyright © 2011-2022 走看看