C#基礎---委托的使用


     一:什么是委托

      委托是一種定義方法簽名的類型 當實例化委托時,您可以將其實例與任何具有兼容簽名的方法相關聯。您可以通過委托實例調用方法。委托是一個引用類型,所以它具有引用類型所具有的通性。它保存的不是實際值,而是保存對存儲在托管堆(managed heap)中的對象的引用。 委托可以引用靜態方法和非靜態方法。

         通俗的理解是,委托其實可以是一種簡單的約束,好比在工作上我聲明了一個委托人A, A同時可以接受(人力資源,后勤公務)兩個參數,那么只要是有人想處理(人力資源,后勤)方面的事情,都可以去注冊到委托人A上,A有能力接受這些方法,然后去處理。

     二:委托的聲明

         聲明委托可以通過delegate來聲明,委托可以依賴於一個類,也可以依賴於一個namespace間。即 在類里面聲明和在類外面聲明。其中delegate可以有返回類型和非返回類型,其中delegate也支持泛型。

public delegate double AddNum(double num1,double num2);
public delegate void ShowMsg(string str);

  三: 委托的使用

     1. 基本使用:下面是一個計算方法,聲明了一個委托CalculatorDelegate,然后在Main方法里面先后注冊了AddNum,和SumNum方法,注冊的方法必須與委托的參數以及返回類型相符合,否者將會提示【委托與注冊方法不匹配的提示】對於這塊是直接編譯無法通過的。委托如果被注冊了多個方法,稱為多播。對於多播,調用委托后,按照注冊順序執行。不過對於有返回值的方法,將返回最后注冊的方法執行后的返回值。

         Notes:第一次注冊方法的時候可以使用【=注冊】或者【new CalculatorDelegate(方法名) 】,后面添加方法用【+】,取消注冊方法用【-】

運行代碼和運行結果如下圖:   

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SpongeBobCoder.Delegate
{
    public delegate double CalculatorDelegate(double num1, double num2); // 委托,聲明在類之外

    public class Program
    {
        public static double AddNum(double num1, double num2)
        {
            Console.WriteLine("Sum={0}", num1 + num2);
            return num1 + num2;
        }

        public static double SubNum(double num1, double num2)
        {
            Console.WriteLine("Sub={0}", num1 - num2);
            return num1 - num2;
        }

        public static void Main(string[] args)
        {
            CalculatorDelegate calculatorDel = AddNum; // 目前為單播
            Console.WriteLine("委托一個方法的結果為:{0}", calculatorDel(1, 2));
            calculatorDel += SubNum; // 目前是多播
            Console.WriteLine("委托兩個方法的結果為:{0}", calculatorDel(1, 2));
            Console.ReadKey();
        }
    }
}

    2. 委托注冊方法的幾種形式:除了上面的方式,其實委托的注冊方法還支持Linq方法,匿名方法。其實在Linq中也大量的委托,比如在使用List<T>.where(),List<T>.sort()這些方法的時候其實里面就運用的大量的委托。其實可以理解為就是委托的縮影。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SpongeBobCoder.Delegate
{
    public delegate double CalculatorDelegate(double num1, double num2); // 委托

    public class Program
    {
        public static void Main(string[] args)
        {
            CalculatorDelegate calculatorDel = delegate(double x, double y) //等效於AddNum方法
            {
                return x + y;
            };
            Console.WriteLine("委托一個方法的結果為:{0}", calculatorDel(1, 2));

            calculatorDel += (x, y) => // 等效於SumNum方法
            {
                return x - y;
            };

            Console.WriteLine("委托兩個方法的結果為:{0}", calculatorDel(1, 2));
            Console.ReadKey();
        }
    }
}

     3. 小添加: 其實在.net框架提供了自帶的委托. Action<T>,Func<T,out Result>。Action是無返回值泛型委托,Func是有返回值的泛型委托【out Result就是返回值,不過使用的時候不是要傳入一個out參數,對於Action<T,T,out Result>,其實就是傳入2個參數。】代碼如下:

          Notes:注意Func<>三個參數,可是AddNum只有兩個,其實第三個就是對應的返回值,這里有別於我們前面說的委托,希望大家注意.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SpongeBobCoder.Delegate
{
    public class Program
    {
        private static void ShowMsg(string str)
        {
            Console.WriteLine(str);
        }

        private static double AddNum(double num1, double num2)
        {
            return num1 + num2;
        }

        public static void Main(string[] args)
        {
            Action<string> action = ShowMsg;
            action("Action委托好用!");
            Func<double, double, double> func = AddNum; // Notes
            Console.WriteLine("Func委托真好用,兩數之和為:{0}", func(1, 2));
            Console.ReadKey();
        }
    }
}

 

       四:總結

           因為最近在接觸Silverlight,事件委托以后會不斷接觸。所以這兩天看了一下事件委托的知識,並寫博客記錄一下。有什么理解不對,描述不對的還請各位博友指點指點。下篇會更新事件的使用。

   


免責聲明!

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



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