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

C# 泛型委托

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

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

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#的类型系统

C#的类型系统

C#的五大数据类型:    类(Class)    结构体(Structures)    枚举(Enumerations)    接口(In...

C#事件_Sample_2

事件的拥有者与事件的响应者是分开的情况+=是事件订阅操作符,左边是事件,右边是事件处理器。using System; using System.Windows.Forms; /// <summary> /// 事件的拥有者和事件的响应者是...

C# 正则表达式(2)

// pattan = @"[^ahou]"; 表示匹配除ahou之外的字符,^在表示反义 string res4 = Regex.Replace(s, @"[^ahou]",&...

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# Stack堆栈

Stack代表了一个先入后出的对象集合。有以下常用方法:表 3Clear()从 Stack 中移除所有对象。Contains(Object)确定某元素是否在 Stack 中。CopyTo(Array, Int32)从指定的数组索引处开始,将 Stac...

PIE二次开发 加载栅格数据

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