委託事件學習之旅(二):泛型委託學習使用

在上一篇博文中,咱們知道了委託就是一種用來聲明一個變量的數據類型,只不過委託聲明的變量能夠接受一個方法,只要方法簽名保持一致就好了。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...

}
相關文章
相關標籤/搜索