当前位置:首页 > C#学习 > 正文内容

C# 委托(二) Delegate、Action、Func

小道5年前 (2018-11-03)C#学习3912

一、Delegate委托:

一般带返回值的Delegate委托:

using System;

namespace Delegate
{
    public delegate int D(int a,int b);//声明委托类型
    class Program
    {
        static void Main(string[] args)
        {
            int a = 2;//声明整型变量
            int b = 3;//声明整型变量
            D d = new D(F);//声明委托变量 并初始化
            Console.WriteLine("{0}+{1}={2}",a,b,d(a,b));//输出
            Console.ReadKey();//按任意键
        }
        static int F(int x,int y)//静态方法
        {
            return x + y;//返回
        }
    }
}

输出结果:

image.png


使用lambda表达式:

using System;

namespace Delegate
{
    public delegate int D(int a);//声明委托类型
    class Program
    {
        static void Main(string[] args)
        {
            int x = 10;//声明整型变量
            Console.WriteLine("—使用完整匿名方法—");
            D d1 = delegate (int a) { return a + 1; };//使用完整匿名方法
            Console.WriteLine(d1(x));//输出
            Console.WriteLine("—使用Lambda表达式1—");
            D d2 = (int a) => { return a + 1; };//使用Lambda表达式1
            Console.WriteLine(d2(x));//输出
            Console.WriteLine("—使用Lambda表达式2—");
            D d3 = (a) => { return a + 1; };//使用Lambda表达式2 可以省略参数类型。
            Console.WriteLine(d3(x));//输出
            Console.WriteLine("—使用Lambda表达式3—");
            D d4 = a => { return a + 1; };//使用Lambda表达式3  只有一个隐式类型参数,可以省略小括号。
            Console.WriteLine(d4(x));//输出
            Console.WriteLine("—使用Lambda表达式4—");
            D d5 = a => a + 1;//使用Lambda表达式4  如果语句块只有一个返回语句,可以省略 return 和大括号。
            Console.WriteLine(d5(x));//输出
            Console.ReadKey();//按任意键
        }
    }
}

输出语句:

image.png


二、Action委托:可以传人参数,没有返回值

调用方法:

using System;

namespace Action
{
    class Program
    {
        static void Main(string[] args)
        {
            Action<int, int> A = new Action<int, int>(Add);//实例化一个委托
            A(2,3);//调用委托
            Console.ReadKey();//按任意键
        }
        static void Add(int a,int b)//静态方法,无返回值
        {
            Console.WriteLine("{0}+{1}={2}",a,b,a + b);//输出
        }
    }
}

输出结果:

image.png


使用lambda表达式:

using System;

namespace Action
{
    class Program
    {
        static void Main(string[] args)
        {
            Action<int, int> A = (a, b) => Console.WriteLine("{0}+{1}={2}", a, b, a + b);//实例化一个委托
            A(2,3);//调用委托
            Console.ReadKey();//按任意键
        }
    }
}

输出结果:

image.png


作为参数传:

using System;

namespace Action
{
    class Program
    {
        static void Main(string[] args)
        {
            Action<string> A1 = p => Console.WriteLine("A1传的值为:{0}",p);//实例化一个委托
            Action<string> A2 = p => Console.WriteLine("A2传的值为:{0}", p);//实例化一个委托
            F(A1,"小道博客");//调用F方法,传入委托参数
            F(A2,"http://www.daobk.com");//调用F方法,传入委托参数
            Console.ReadKey();//按任意键
        }
        static void F<T>(Action<T> a,T input)//方法
        {
            a(input);//调用委托
        }
    }
}

输出结果:

image.png


三、Func委托:可以传入参数,必须有返回值。

调用方法:

using System;

namespace Func
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<string> F = new Func<string>(S);//实例化一个委托
            string s = F();//将返回值赋值给变量s
            Console.WriteLine(s);//输出s的值
            Console.ReadKey();//按任意键
        }
        static string S()//静态方法
        {
            return "小道博客:http://www.daobk.com";//返回值
        }
    }
}

输出结果:

image.png


使用Lambda表达式:

using System;

namespace Func
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<string> F1 = () => "小道博客";//实例化一个委托,不加大括号,直接写返回值,不能加 return
            Func<string> F2 = () => 
            {
                string a = "http://";
                a += "www.daobk.com";
                return a;
            };//另一种实例化一个委托,加大括号,可以写多行代码,但必须加上 return
            string s1 = F1();//调用委托
            string s2 = F2();//调用委托
            Console.WriteLine(s1);//输出
            Console.WriteLine(s2);//输出
            Console.ReadKey();//按任意键
        }
    }
}

输出结果:

image.png


作为参数传:

using System;

namespace Func
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<int,string> F1 = (p) => "序号:" + p;//实例化一个委托,注意不加大括号,写的值就是返回值,不能带return
            Func<string, string> F2 = (p) => 
            {
                string s = "小道博客:";
                s += p;
                return s;
            };//另一种实例化一个委托,加大括号,可以写多行代码,但必须加上 return
            string s1 = S(F1,1);//调用方法
            string s2 = S(F2,"http://www.daobk.com");//调用方法
            Console.WriteLine(s1);//输出
            Console.WriteLine(s2);//输出
            Console.ReadKey();//按任意键
        }
        static string S<T>(Func<T,string> a,T input)//方法
        {
             return a(input);//返回
        }
    }
}

输出结果:

image.png


总结:

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

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

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


以上节选自《博客园

更多参考《博客园

扫描二维码推送至手机访问。

版权声明:本文由小道发布,如需转载请注明出处。

本文链接:https://www.daobk.com/post/111.html

分享给朋友:

“C# 委托(二) Delegate、Action、Func” 的相关文章

提示用户输入自己姓和名,最后输出姓名

提示用户输入自己姓和名,最后输出姓名

提示用户输入自己姓和名,最后输出姓名            Console.WriteLine("请输入您的姓");//提示用户输入他的姓。  &n...

while语句:要求用户输入用户名和密码,只要不是admin、888888就一直提示要求重新输入。

while语句:要求用户输入用户名和密码,只要不是admin、888888就一直提示要求重新输入。

while语句:要求用户输入用户名和密码,只要不是admin、888888就一直提示要求重新输入。            Console.WriteLine("请输入用户...

​while语句:不断要求用户输入一个数字(假定用户输入的都是正整数)

​while语句:不断要求用户输入一个数字(假定用户输入的都是正整数)

while语句:不断要求用户输入一个数字(假定用户输入的都是正整数),当用户输入end的时候显示刚才输入的数字中的最大值。设一个变量int max,初始值为0,用户每输入一次就把用户输入的和max比较一下,如果输入的比max大,则让max等于用户输入。    ...

函数:给我一个字符串,然后字符串使用我指定的分隔符来进行分割

函数:给我一个字符串,然后字符串使用我指定的分隔符来进行分割

函数就是将一堆代码进行重用的一种机制。函数就是一段代码,这段代码可能有输入的值(参数),可能会返回值。一个函数就像一个专门做这件事的人,我们调用它来做一些事情,它可能需要我们提供一些数据给它,它执行完成后可能会有一些执行结果给我们。要求的数据就叫参数,返回的执行结果就是返回值。有了函数写代码就像拼积...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。