分享

.net中的各种委托(Delegate、Action、Func)

 _明心见性_ 2018-11-16

1、Delegate,委托的鼻祖

 

复制代码
        protected delegate int ClassDelegate(int x, int y);//定义委托类型及参数
        static void Main(string[] args)
        {
            ClassDelegate dele = new ClassDelegate(Add);//实例化一个委托

            Console.WriteLine(dele(1, 2));//调用委托
            Console.ReadKey();
        }

        static int Add(int a, int b)
        {
            return a + b;
        }
复制代码

 

 

2、Action,可以传入参数,没有返回值的委托

方法1,调用方法

复制代码
        static void Main(string[] args)
        {
            Action<int, int> ac = new Action<int, int>(ShowAddResult);//实例化一个委托
            ac(1, 2);//调用委托

            Console.ReadKey();
        }

        static void ShowAddResult(int a, int b)
        {
            Console.WriteLine(a + b);
        }
复制代码

 

方法2,使用lambda表达式

复制代码
        static void Main(string[] args)
        {
            Action<int, int> ac = ((p, q) => Console.WriteLine(p + q));//实例化一个委托
            ac(1, 2);//调用委托

            Console.ReadKey();
        }
复制代码

 

方法3,作为参数传

复制代码
        static void Main(string[] args)
        {
            Action<string> ac = (p => Console.WriteLine("我是方法1,传入值:"+p));//实例化一个委托
            Action<string> ac2 = (p => Console.WriteLine("我是方法2,传入值:" + p));//实例化另一个委托

            Test(ac, "参数1");//调用test方法,传入委托参数
            Test(ac2, "参数1");//调用test方法,传入委托参数

            Console.ReadKey();
        }

        static void Test<T>(Action<T> ac, T inputParam)
        {
            ac(inputParam);
        }
复制代码

 

 

 

3、Func,可以传入参数,必须有返回值的委托

 方法1,调用方法

复制代码
        static void Main(string[] args)
        {
            Func<string> fc1 = new Func<string>(ShowAddResult);//实例化一个委托
            string result = fc1();//调用委托

            Console.WriteLine(result);
            Console.ReadKey();
        }
        static string ShowAddResult()
        {
            return "地球是圆的";
        }
复制代码

 

方法2,使用lambda表达式

复制代码
        static void Main(string[] args)
        {
            //实例化一个委托,注意不加大括号,写的值就是返回值,不能带return
            Func<string> fc1 = () => "地球是圆的";

            //实例化另一个委托,注意加大括号后可以写多行代码,但是必须带return
            Func<string> fc2 = () =>
            {
                return "地球是圆的";
            };

            string result = fc1();//调用委托
            string result2 = fc2();//调用委托

            Console.WriteLine(result);
            Console.WriteLine(result2);
            Console.ReadKey();
        }
复制代码

 

方法3,作为参数传

复制代码
        static void Main(string[] args)
        {
            //实例化一个委托,注意不加大括号,写的值就是返回值,不能带return
            Func<int, string> fc1 = (p) => "传入参数" + p + ",地球是圆的";

            //实例化另一个委托,注意加大括号后可以写多行代码,但是必须带return
            Func<string, string> fc2 = (p) =>
            {
                return "传入参数" + p + ",地球是圆的";
            };

            string result = Test<int>(fc1, 1);//调用委托
            string result2 = Test<string>(fc2, "1");//调用委托

            Console.WriteLine(result);
            Console.WriteLine(result2);
            Console.ReadKey();
        }

        static string Test<T>(Func<T, string> fc, T inputParam)
        {
            return fc(inputParam);
        }
复制代码

 

总结:

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

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

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

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多