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


 在我這菜鳥理解上,委托就是可以用方法名調用另一方法的便捷方法,可以簡化switch等語句的重復。最近做項目的時候恰好需要用到委托,便來復習及學習委托的使用。嗯...本人以前並沒有用過,只是稍微知道而已。以下是整理的筆記。

一.委托的概念

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

二.委托類型的定義

委托類型必須在被用來創建變量以及類型對象之前聲明。

委托類型的聲明:

1.以delegate關鍵字開頭。

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

delegate void MyDel(int a)


三.實例

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();
        }
    }
}

結果如下圖:

 

那么有時候我們需要返回每個方法的結果,此方法就不適用了,那怎么才能實現每個方法的返回結果都可以獲取到呢?后續再寫了。今天就簡單的介紹了委托的基本概念和使用。

 

五、泛型委托

 

泛型的委托,就是然參數的類型不確定,例如代碼改寫為:

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

泛型的詳細內容不屬於本文的介紹范圍,這里不加多說了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM