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

C# 泛型委托

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

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

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# 与文件相关的几个类(3)

Path类,处理文件或路径的类,是一个静态类。方法:PathChangeExtension(String, String)更改路径字符串的扩展名。返回值为string。Combine(String, String)将两个字符串组合成一个路径。GetDirectoryName(String)返回指定路...

PIE二次开发 加载栅格数据

1、获得栅格数据集路径2、打开栅格数据集3、创建栅格图层4、将数据添加到图层并刷新要添加两个引用:using PIE.DataSource;using PIE.Carto;// 获得要打开栅格数据的路径 OpenFileDialog file = new&n...

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

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

C、C++、C#交换变量

C、C++、C#交换变量

最近重新看了看C和C++,觉得有些地方挺有意思。作为一开始不管什么资料都会用来做例子的一个程序,交换变量。不管在哪,常用的int,float,double类型的变量都是值类型的,作为参数传到函数(方法)中时,其实是复制了一个值进去,也就是说通过函数是无法直接更改这些值的,只能通过一些间接的方法来更改...

C语言 异或运算符 ^

C语言中异或运算符^表示参见运算的二进制运算符相同为0,不同为1,如下:1 ^ 1 = 01 ^ 0 = 10 ^ 1 = 10 ^ 0 = 0下面举例说明∧运算符的应用:  (1)使特定位翻转  假设有01111010,想使其低4位翻转,即1变为0,0变为1。可以将它与00001111进行∧运算,...

C语言结构体

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