程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#基礎---委托的使用

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

編輯:C#入門知識

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,事件委托以後會不斷接觸。所以這兩天看了一下事件委托的知識,並寫博客記錄一下。有什麼理解不對,描述不對的還請各位博友指點指點。下篇會更新事件的使用。      

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved