当前位置:首页 > 代码相关 > 正文内容

C# 泛型委托

admin5年前 (2020-04-02)代码相关6747

虽然没有必要,但是还是先看看自定义的泛型委托:

namespace _20200402
{
    class Program
    {
        static void Main(string[] args)
        {
            MyDele<int> myDele1 = new MyDele<int>(Add);  //实例化委托,此时为返回值为int,含有两个int参数的委托,委托传入的是Add方法
            int resu = myDele1(20, 30);                  //通过委托调用方法
            Console.WriteLine(resu);                     //输出结果
            MyDele<double> myDele2 = new MyDele<double>(Muti); //实例化委托,此时为返回值为double,含有两个double参数的委托,委托传入的是Muti方法
            double resu2 = myDele2(2.02, 3.03);                //通过委托调用方法
            Console.WriteLine(resu2);                          //输出结果
        }


        static double Muti(double x, double b) //含有两个double类型的参数,返回值为double的静态方法
        {
            return x * b;
        }

        static int Add(int x, int y)          //含有两个int类型的参数,返回值为int类型的静态方法
        {
            return x + y;
        }

        delegate T MyDele<T>(T x, T y);       //声明泛型委托,T为泛化的类型,随着使用的不同而不同

    }

}

当然,.NET 框架为我们封装了泛型委托类,因此大部分情况下我们不必再声明委托,可以拿来直接实例化使用,常用的是Func<T>委托、Action<T>委托

Action<>委托具有16个重载,它具有参数传入,但不返回值,不同的重载是传入参数个数不一样,传入的参数不必是同一类型,可以为不同类型。

image.png

Func<>委托有17个重载,<>之内至少有一个参数,只有一个的话,代表返回值类型;若和下图相似,则最后一个为返回值类型,其余的均为传入的参数类型。

image.png

namespace _20200402_2
{
    class Program
    {
        static void Main(string[] args)
        {
            Action action1 = new Action(M1);  //无参数的Action委托,传入的方法为M1
            action1();

            Action<int> action2 = new Action<int>(M2); //传入参数为int类型的Action委托,传入的方法为M2
            action2(3);

            Action<int, string> action3 = new Action<int, string>(M3); //传入参数为int和string类型的委托,传入的方法为M3
            action3(3, "Hello");

        }

        static void M1()
        {
            Console.WriteLine("Hello world!");
        }
        static void M2(int x)
        {
            Console.WriteLine($"{x} * {x} = {x * x}");
        }
        static void M3(int x,string str)
        {
            for (int i = 0; i < x; i++)
            {
                Console.WriteLine(str);
            }
        }
    }
}
namespace _20200402_3
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<int, int, int> func = new Func<int, int, int>(Add);
            //前两个int表示传入参数的类型,最后int表示返回值的类型,传入的方法是Add方法

            int resu = func(2, 8);
            Console.WriteLine(resu);
        }


        static int Add(int x, int y)
        {
            return x + y;
        }
    }
}


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

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

本文链接:https://www.lovedm.club/?id=27

分享给朋友:

“C# 泛型委托” 的相关文章

C# 属性,get,set使用

属性反映了状态,是对字段的自然扩展。下面的代码,有一个学生类,类中有年龄属性,通过get,set对年龄进行值的获取与设置,同时对年龄进行约束,使值控制在0-120之间,否则抛出异常信息。namespace _20200324_2 {     cl...

C#事件_Sample_1

事件模型的五个组成部分:1、事件的拥有者(event source,只能是对象或类)2、事件成员(event,成员)3、事件的响应者(event subscriber,对象)4、事件处理器(event handler,成员)--本质上是一个回调方法5、事件订阅--把事件...

C# 测量运行时间

使用Stopwatch类进行运行时间的监测要使用 System.Diagnostics 命名空间方法表 4Reset()停止时间间隔测量,并将运行时间重置为零。Restart()停止时间间隔测量,将运行时间重置为零,然后开始测量运行时间。Start()开始或继续测量某个时间间隔的运行时间。...

C# 使用FileStream进行文件复制操作

使用文件流进行操作,如下,其中注释部分是和非注释部分一样的,但是使用using语句是执行完后自动释放内存,而注释部分是手动释放。CopyFile方法中,缓冲区大小设为1024*1024字节,也就是1MB,Read方法和Write方法中,第一个参数都是缓冲区数组,第二个参数都是偏移量,这个量是在缓冲区...

偶然想到的一个问题。。。

偶然想到的一个问题。。。

今天突然想C#中,用数组中的Max()方法和直接通过比较获取最大值的时间谁快,于是试了试:       static void Main(string[] args)   &nb...