委托, 泛型委托,Func<T>和Action<T>

使用委托来做一些事情,大致思路是:

1、定义声明一个委托,规定输入参数和输出类型。
2、写几个符合委托定义的方法。
3、把方法列表赋值给委托
4、执行委托

    internal delegate int MyDelegate();

    class Program
    {
        static void Main(string[] args)
        {
            MyDelegate d = ReturnOne;
            d += ReturnTwo;
            foreach (int i in GetAllReturnVals(d))
            {
                Console.WriteLine(i);
            }
            Console.ReadKey();
        }

        static IEnumerable<int> GetAllReturnVals(MyDelegate myDelegate)
        {
            foreach (MyDelegate del in myDelegate.GetInvocationList())
            {
                yield return del();
            }
        }

        static int ReturnOne()
        {
            return 1;
        }

        static int ReturnTwo()
        {
            return 2;
        }
    }

以上,委托的返回类型是int,如果让返回类型是泛型呢?只要让以上的GetAllReturnVals方法针对泛型就可以了。

   internal delegate T MyDelegate<T>();

    class Program
    {
        static void Main(string[] args)
        {
            MyDelegate<int> d = ReturnOne;
            d += ReturnTwo;
            foreach (int i in GetAllReturnVals(d))
            {
                Console.WriteLine(i);
            }

            MyDelegate<string> d1 = ReturnA;
            d1 += ReturnB;
            foreach (string s in GetAllReturnVals(d1))
            {
                Console.WriteLine(s);
            }
            Console.ReadKey();
        }

        //返回所有委托方法的执行结果
        static IEnumerable<T> GetAllReturnVals<T>(MyDelegate<T> myDelegate)
        {
            foreach (MyDelegate<T> del in myDelegate.GetInvocationList())
            {
                yield return del();
            }
        }

        static int ReturnOne()
        {
            return 1;
        }

        static int ReturnTwo()
        {
            return 2;
        }

        static string ReturnA()
        {
            return "A";
        }

        static string ReturnB()
        {
            return "B";
        }
    }


不过,.NET还为我们准备了一个更"懒 "的方法,那就是针对泛型的委托Func<T>,这下,连委托都不要事先声明了。Func<T>的<>中的泛型列表的最后一个是返回类型,其它的都是输入类型,Func<T>多达十几个重载。

   class Program
    {
        static void Main(string[] args)
        {
            Func<int> d = ReturnOne;
            d += ReturnTwo;
            foreach (int i in GetAllReturnVals(d))
            {
                Console.WriteLine(i);
            }

            Func<string> d1 = ReturnA;
            d1 += ReturnB;
            foreach (string s in GetAllReturnVals(d1))
            {
                Console.WriteLine(s);
            }
            Console.ReadKey();
        }

        //返回所有委托方法的执行结果
        static IEnumerable<T> GetAllReturnVals<T>(Func<T> myDelegate)
        {
            foreach (Func<T> del in myDelegate.GetInvocationList())
            {
                yield return del();
            }
        }

        static int ReturnOne()
        {
            return 1;
        }

        static int ReturnTwo()
        {
            return 2;
        }

        static string ReturnA()
        {
            return "A";
        }

        static string ReturnB()
        {
            return "B";
        }
    }


以上泛型委托Func<T>同时有输入参数和返回类型,如果返回类型为void,那就可以使用Action<T>了,当然Action<T>也有多达十几个重载。

   class Program
    {
        static void Main(string[] args)
        {

            Action<int> a1 = ReturnInt;
            a1(1);

            Action<string> a2 = ReturnStr;
            a2("hello");

            Console.ReadKey();
        }

        static void ReturnStr(string s)
        {
            Console.WriteLine(s);
        }

        static void ReturnInt(int a)
        {
            Console.WriteLine(a);
        }


    }


总结:Func<T>和Action<T>是泛型委托的"语法糖",如果返回类型为void,那就使用Action<T>,否则使用Func<T>。

时间: 2024-10-23 16:51:03

委托, 泛型委托,Func<T>和Action<T>的相关文章

【C#复习总结】细说泛型委托

1 前言 本系列会将[委托] [匿名方法][Lambda表达式] [泛型委托] [表达式树] [事件]等基础知识总结一下.(本人小白一枚,有错误的地方希望大佬指正) 系类1:细说委托 系类2:细说匿名方法 系列3:细说Lambda表达式 系列4:细说泛型委托 系列5:细说表达式树 系列6:细说事件 还是用大佬的文章来震场吧,“随着.net版本的不升级,新版本总要区别于旧版本吧,不然微软的工程师怎么向他们的老大交差呀?所以微软又来玩新花样了.” 这次我们提前贴代码来体验一下泛型委托与一般委托和匿名

C# 泛型委托和多播委托

泛型委托的定义 泛型委托的作用可以使程序定义一个委托,满足多个需求,如需要定义一个int类型参数的委托和定义一个string类型类型的委托时,直接使用泛型,就可以减少多次定义委托 泛型委托定义时候只需要再方法名后加:<类型在方法中的名字> 类型可以是多个,多个类型之间用 ”,“ 逗号隔开 // 定义泛型委托 delegate void MyDelegate<T>(T str); // 定义返回值为泛型的委托 delegate Y MyDelegate1<T, Y>(T

C#高级编程三十天----泛型结构,泛型方法,泛型委托

泛型结构 泛型结构和泛型类几乎是一直的,只是泛型结构没有继承的特性..NET平台提供的一个泛型结构是(可空类型)Nullablle<T>.可空类型的引入,主要是为了解决数据库语言中的数字与编程语言中的数字的区别(数据库中数字可以为空,编程语言中数字不可为空).因为Nullable<T>使用过于的繁琐,于是就引入了一种特殊的语法,使用个"?"运算符.例: int? x1; Nullable<int> x2; x1和x2这两种方式定义是等价的. 非空类型

Func&lt;T&gt;与Action&lt;T&gt;委托泛型

Func<T>与Action<T>委托泛型介绍 .Net 3.5之后,微软推出了Func<T>与Action<T>泛型委托.进一步简化了委托的定义. Action<T>委托主要的表现形式如下: public delegate void Action(); public delegate void Action<T1>(T1 arg1); public delegate void Action<T1, T2>(T1 arg1

泛型委托 Predicate/Func/Action

Predicate 泛型委托  表示定义一组条件并确定指定对象是否符合这些条件的方法.此委托由 Array 和 List 类的几种方法使用,用于在集合中搜索元素.看看下面它的定义: // Summary:    //     Represents the method that defines a set of criteria and determines whether    //     the specified object meets those criteria.    ////

C#语法糖之第六篇: 泛型委托- Predicate&lt;T&gt;、Func&lt;T&gt;

今天继续分享泛型委托的Predicate<T>,上篇文章讲了Action委托,这个比Action委托功不一样的地方就是委托引用方法是Bool返回值的方法,Action为无返回值.首先我们看一下它的定义吧: 1 public delegate bool Predicate<T>(T obj); 从其定义可以看到,此委托引用一个返回bool 值的方法,在实际开发中,通常使用Predicate<T>委托变量引用一个“判断条件函数”,在判断条件函数内部书写代码表明函数参数所引用

委托,C#本身的委托(Action Func)

1.Action 分为带泛型的和不带泛型的,带泛型可传入任何类型的参数. 格式如下: 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.Windows.Input; 7 8 namespace Demo1 9 { 10 class Program 11 { 12 st

Java实现泛型委托类似C#Action&lt;T&gt;

一.C# Action<T> 泛型委托(帮助理解委托) 描述: 封装一个方法,该方法只采用一个参数并且不返回值. 语法: public delegate void Action<T>(T arg); T: 参数类型:此委托封装的方法的参数类型 arg: 参数:此委托封装的方法的参数 备注: 通过此委托,可以将方法当做参数进行传递.Action<T> 泛型委托:封装一个方法,该方法只采用一个参数并且不返回值.可以使用此委托以参数形式传递方法,而不用显式声明自定义的委托.该

C#语法糖之第五篇: 泛型委托- Action&lt;T&gt;

因为工作的原因(其实还是个人的惰性)昨天没有给大家分享文章,然后这几天也有很多园友也提出了他们报告的意见及指导,再次感谢这些兄弟们的照顾我 和支持,这个分类的文章我当时想的是把我的学习经验和工作中用到的语法给大家分享给大家,希望能起到帮助的作用,但是本人也是个菜鸟,不是什么大神,所以 学习中也有不足的地方和没有扫到的地方,这里对上次扩展方法语法糖的问题,扩展方法确实是3.0开始就有了,或许是我以前没有用到,也没有查询欠缺,若要给大家带来不便,请大家原谅,现在把标题也修改为C#语法糖了,这里给大家