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

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个传入参数,无返回值

时间: 2024-11-05 13:11:38

.net中的各种委托(Delegate、Action、Func)的相关文章

温故而知新:Delegate,Action,Func,匿名方法,匿名委托,事件

一.委托Delegate 一般的方法(Method)中,我们的参数总是string,int,DateTime...这些基本的数据类型(或者没有参数),比如 public void HelloWorld() { Console.WriteLine("Hello World!"); } public void HelloWorld(string name) { Console.WriteLine("Hello ,{0}!", name); } 但是有些时候,我们希望把一

c# delegate action func predicate event 匿名函数 lambda

1.delegate 是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类. 与其它的类不同,delegate类能够拥有一个签名 (signature),并且它只能持有与它的签名相匹配的方法的引用. 它所实现的功能与C/C++中的函数指针十分相似.它允许你传递一个类A的方法m 给另一个类B的对象,使得类B的对象能够调用这个方法m.但与函数指针相比,delegate有许多函数指针不具备的优点: 首先,函数指针只能指向静态函 数,而delegate既可以引用静态函数,又可以引用非静态成员函

lambda表达式不使用委托(delegate) 用FUNC

lLambda不使用delegate关键字,而使用  Lambda运算符 => goes to l    1.Func<int,string> getInput = (int age) => { l         return Console.ReadLine() + age; l    }; l可以不显示声明参数的数据类型(编译器可以根据委托参数推断) l    2.Func<int,string> getInput = (age) => { l       

C#委托(delegate、Action、Func、predicate)

委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递.事件是一种特殊的委托. 1.委托的声明 (1). delegate delegate我们常用到的一种声明   Delegate至少0个参数,至多32个参数,可以无返回值,也可以指定返回值类型.   例:public delegate int MethodtDelegate(int x, int y);表示有两个参数,并返回int型. (2). Action Action是无返回值的泛型委托. Action 表示无参,

C#中常见的委托(Func委托、Action委托、Predicate委托)

今天我要说的是C#中的三种委托方式:Func委托,Action委托,Predicate委托以及这三种委托的常见使用场景. Func,Action,Predicate全面解析 首先来说明Func委托,通过MSDN我们可以了解到,Func委托有如下的5种类型: (1) *delegate TResult Func<TResult>(); (2)*delegate TResult Func<T1,TResult>(T1 arg1); (3) *delegate TResult Func&

C#委托(delegate、Action、Func、predicate)和事件

一.前言 刚开始工作的时候,觉得委托和事件有些神秘,而当你理解他们之后,也觉得好像没有想象中的那么难.在项目中运用委托和事件,你会发现他非常棒,这篇博文算是自己对委托和事件的一次梳理和总结. 二.委托 C#中的委托,相当于C++中的指针函数,但委托是面向对象的,是安全的,是一个特殊的类,当然他也是引用类型,委托传递的是对方法的引用. 2.1.delegate 声明委托就必须使用关键字“delegate”,委托是先声明,后实例化.至少0个参数,至多32个参数 格式如下所示: private del

委托delegate 泛型委托action&lt;&gt; 返回值泛型委托Func&lt;&gt; 匿名方法 lambda表达式 的理解

1.使用简单委托 namespace 简单委托 { class Program { //委托方法签名 delegate void MyBookDel(int a); //定义委托 static MyBookDel myBookDel; //普通方法 public static void MathBook(int a) { Console.WriteLine("我是数学书" + a); } static void Main(string[] args) { myBookDel += Ma

Delegate Action&lt;T in&gt; Func&lt;T in,out Tresult&gt; Predicate&lt;T&gt;

action<T> 和  func<T> 都是delegate的简写形式,其中T为可以接受的参数类型 action<T> 指那些只有输入参数,没有返回值 Delegate 的代码 1 public delegate void myDelegate(string str); //申明 2 public static void HellowChinese(string strChinese) 3 { 4 Console.WriteLine("Good mornin

.NET : Func委托和Action委托

上一篇我们讲到了如何在ASP.NET页面中实现异步任务.我们来回顾一下里面一个特殊的类型:LongTimeTask public class LongTimeTask{    public string Result = string.Empty;    public HelloWorldHandler handler; public delegate string HelloWorldHandler();    public string HelloWorld()    {        Th