委托事件学习之旅(二):泛型委托学习使用

在上一篇博文中,咱们知道了委托就是一种用来声明一个变量的数据类型,只不过委托声明的变量能够接受一个方法,只要方法签名保持一致就好了。spa

泛型委托:code

通常在咱们项目中会使用委托,因此咱们来定义几个委托:blog

namespace DemoForDelegate
{
    public delegate void delegateInt(int m);
    public delegate void delegatedouble(double d);
    public delegate void delegatestring(string str);
    public delegate void delegatefloat(float f);
    public delegate void delegatedecimal(decimal d);
}

咱们定义了5个委托,这5个委托用于接受不一样的方法。ci

可是,咱们仔细找下规律就会发现其实这5个委托很类似:返回类型都是void,方法输入参数为1个。不一样的是参数的数据类型。那么我想简化一下代码,想写一个通用的委托来取代上面那5个委托,既然它们的差别是参数的数据类型,那么很容易想到用泛型来让代码变得通用,以下:string

namespace DemoForDelegate
{
    //public delegate void delegateInt(int m);
    //public delegate void delegatedouble(double d);
    //public delegate void delegatestring(string str);
    //public delegate void delegatefloat(float f);
    //public delegate void delegatedecimal(decimal d);

    public delegate void MyAction<T>(T arg);
}

这样用一个委托就搞定了,因此在咱们项目能够这样多定义一些这样的泛型委托:io

namespace DemoForDelegate
{
    public delegate void MyAction();
    public delegate void MyAction<T>(T arg);
    public delegate void MyAction<T1, T2>(T1 arg1, T2 arg2);
    public delegate void MyAction<T1, T2, T3>(T1 arg1, T2 arg2,T3 arg3);
    public delegate void MyAction<T1, T2, T3, T4>(T1 arg1, T2 arg2,T3 arg3,T4 arg4);
    //more...
}

上面的委托都没有返回值,那咱们再定义一些带返回值的委托吧:class

namespace DemoForDelegate
{
    public delegate void MyAction();
    public delegate void MyAction<T>(T arg);
    public delegate void MyAction<T1, T2>(T1 arg1, T2 arg2);
    public delegate void MyAction<T1, T2, T3>(T1 arg1, T2 arg2,T3 arg3);
    public delegate void MyAction<T1, T2, T3, T4>(T1 arg1, T2 arg2,T3 arg3,T4 arg4);
    //more...

    //带返回值的委托
    public delegate TResult MyFunc<out TResult>();
    public delegate TResult MyFunc<out TResult,in T1>(T1 arg1);
    public delegate TResult MyFunc<out TResult,in T1,in T2>(T1 arg1,T2 arg2);
    public delegate TResult MyFunc<out TResult,in T1,in T2,in T3>(T1 arg1, T2 arg2,T3 arg3);
    //more...

}
相关文章
相关标签/搜索