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