c#委託(Delegates)--基本概念及使用

 在我這菜鳥理解上,委託就是能夠用方法名調用另外一方法的便捷方法,能夠簡化switch等語句的重複。最近作項目的時候剛好須要用到委託,便來複習及學習委託的使用。嗯...本人之前並無用過,只是稍微知道而已。如下是整理的筆記。學習

一.委託的概念spa

    委託是用戶自定義的類,它定義了方法的類型。儲存的是一系列具備相同參數和返回類型方法的地址列表,調用委託時,此委託列表的全部方法都將被執行。code

二.委託類型的定義對象

委託類型必須在被用來建立變量以及類型對象以前聲明。blog

委託類型的聲明:string

1.以delegate關鍵字開頭。it

2.返回類型+委託類型名+參數列表io

delegate void MyDel(int a)


三.實例class

1)如今咱們先建立了控制檯程序,進行簡單的實例泛型

namespace Func
{
    public delegate void MyDel();//聲明一個自定義委託
    class Program
    {
        static void Main(string[] args)
        {
            MyDel say1 = SayHi;
            MyDel say2 = new MyDel(SayHi);
            say1();
            say2();
        }
        static void SayHi()
        {
            Console.WriteLine("hi");
        }
    }
}

2)擴展實例

namespace Func
{
    public delegate int MyDel(int num);//聲明一個自定義委託
    class Program
    {
        static int Add1(int a)
        {
            int b = 10 + a;
            Console.WriteLine("——Add1———");
            return b;
 
        }
 
        static int Add2(int a)
        {
            int b = 10 - a;
            Console.WriteLine("——Add2———");
            return b;
 
        }
 
        static void Calculate(MyDel ex, int a)
        {
            var result = ex(a);
            Console.WriteLine(result + "\n");
        }
 
        static void Main(string[] args)
        {
            Calculate(Add1, 1);
            Calculate(Add2, 10);
            Console.ReadKey();
        }
    }
}

結果以下圖

 

上面實現了「把方法看成參數在另外一個方法中傳遞或調用」;從上面能夠看出,調用的方法和委託的返回類型,參數類型都必須一致。

我咱們能夠把委託做爲參數傳遞給封裝好了的方法,經過委託來動態的調用方法。

 

四.委託的加減運算


能夠使用+=運算符,爲委託新增方法。

一樣能夠使用-=運算符,爲委託移除方法。

當委託列表中有幾個方法時,調用委託時,則會依次通過各個方法,並返回列表最後一項方法的結果。

namespace Func
{
    public delegate int MyDel(int num);//聲明一個自定義委託
    class Program
    {
 
        static int Add1(int a)
        {
            int b = 10 + a;
            Console.WriteLine("——Add1———");
            return b;
 
        }
 
        static int Add2(int a)
        {
            int b = 10 - a;
            Console.WriteLine("——Add2———");
            return b;
 
        }
 
        static void Calculate(MyDel ex, int a)
        {
            var result = ex(a);
            Console.WriteLine(result + "\n");
        }
 
        static void Main(string[] args)
        {
            //Calculate(Add1, 1);
            //Calculate(Add2, 10);
            MyDel myDel = Add1;
            myDel += Add2;
            Calculate(myDel, 10);
            Console.ReadKey();
        }
    }
}

結果以下圖:

 

那麼有時候咱們須要返回每一個方法的結果,此方法就不適用了,那怎麼才能實現每一個方法的返回結果均可以獲取到呢?後續再寫了。今天就簡單的介紹了委託的基本概念和使用。

 

5、泛型委託

 

泛型的委託,就是然參數的類型不肯定,例如代碼改寫爲:

using System;
using System.Collections.Generic;
using System.Text;

namespace TestApp
{
    /// <summary>
    /// 委託
    /// </summary>
    /// <param name="s1"></param>
    /// <param name="s2"></param>
    /// <returns></returns>
    public delegate string ProcessDelegate<T,S>(T s1, S s2);

    class Program
    {
        static void Main(string[] args)
        {
            /*  調用方法  */
            ProcessDelegate<string,int> pd = new ProcessDelegate<string,int>(new Test().Process);
            Console.WriteLine(pd("Text1", 100));
        }
    }

    public class Test
    {
        /// <summary>
        /// 方法
        /// </summary>
        /// <param name="s1"></param>
        /// <param name="s2"></param>
        /// <returns></returns>
        public string Process(string s1,int s2)
        {
            return s1 + s2;
        }
    }
}

輸出的結果就是:Text1100泛型的詳細內容不屬於本文的介紹範圍,這裏不加多說了。

相關文章
相關標籤/搜索