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

C# 泛型委托

admin6年前 (2020-04-02)代码相关6975

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

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# 泛型委托” 的相关文章

C# WPF程序 显示时间

C# WPF程序 显示时间

例子来源于此视频https://www.bilibili.com/video/av1422127?p=4 此例子是想说明有的类主要使用它的事件namespace Wpf_test {     /// <summary> &...

C# 正则表达式(1)

C# 正则表达式(1)

用于匹配输入文本的模式string s = "this is a test!"; string res = Regex.Replace(s, "^",&nbs...

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

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

PIE 分块读写数据

PIE 分块读写数据

手头的影像数据量比较大,尺寸是 20009*10165 的,直接创建数组会导致栈溢出,因此决定分块,思路也比较简单,如图:只是把x分成多份,y不变,这样代码写起来也简单,只要做好最后一个块的宽度的判断就好了。我这里是把一个float型的单波段影像做了一个阈值分割,输出到一个byte影像中,分块是以...

C语言malloc()函数

C语言中malloc()函数,用于分配所需的内存,并返回一个指向该内存的指针。注意这是C的标准库函数,不是C的关键字,在<stdlib.h>头文件下。函数声明: void *malloc(size_t size)其中,size是要分配的内存的大小,单位是字节。返回一个指针 ,指向已分配大...

C语言scanf一个容易出错的地方

今天用scanf()写一个数组循环输入,运行时很奇怪,明明只需要输入三个数,但是实际上要多输入一个,瞅了好一会才看到我是这么写的scanf("%d ",&p[i]);问题就出在这个 上,写printf()写习惯了,顺手就加上了 ,注意不要加!不要加!...