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

C# 泛型委托

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

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

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://lovedm.club/?id=27

分享给朋友:

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

递归计算1到x的和

递归真是个神奇的东西,当时学C的时候就没搞明白,学C#又遇到例子了。        public int SumXTo1(int x)     &n...

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

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

C#(或者Java)反转数组

将原数组反转,如[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]反转后变为[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]因为数组是引用类型,所以直接在方法中处理即可,C#和Java写法一样,如下:      &nb...

C语言字符串换行连接

C语言字符串换行连接

有时候遇到一个字符串太长一行放下不好看的情况,可以使用换行连接:一是使用 符号,如下所示:char* testString = "AAA BBB";运行如下:注意换行后的内容一定要顶到格子的最前面,否则会把前面的空格也算上。char* ...

C语言结构体

C语言的结构(struct)是一种复杂的数据类型,可以包含多种数据类型,基本类型都能包含,但是不能包含函数,这是和C++中的结构不同的地方,但是可以包含函数指针,但是这也并不矛盾,因为本身指针指向的是一个地址,也是一个变量。下面是结构的定义的示例:struct Name {  ...

C语言qsort简单使用

qsort函数位于stdlib.h头文件里。是用来排序的函数,函数原型如下:void qsort(void *ptr, size_t count, size_t size, int (*comp)(const void *, const void *));四个参数:ptr:指向待排序数组的指针cou...