標籤:
委託是一個型別安全的對象,它指向程式中另一個以後會被調用的方法(或多個方法)。通俗的說,委託是一個可以引用方法的對象,當建立一個委託,也就建立一個引用方法的對象,進而就可以調用那個方法,即委託可以調用它所指的方法。
1、定義委託類型
[存取修飾詞]delegate 傳回型別 委託名(形參);
2、聲明委派物件
委託名 委託執行個體名;
3、建立委派物件(確定與哪些方法進行綁定)
委託執行個體名=new 委託名(某個類的方法)
4、使用委託調用方法
委託執行個體名(實參)
1、委託和方法必須具有相同的參數。
2、委託可以調用多個方法,即一個委派物件可以維護一個可調用方法的列表而不是單獨的一個方法,稱為多路廣播(多播)。
3、使用+=和-=運算實現方法的增加和減少
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Delegate;
namespace Delegate
{
public delegate int Call(int num1, int num2);//第一步:定義委託類型
class SimpleMath
{
// 乘法方法
public int Multiply(int num1, int num2)
{
return num1 * num2;
}
// 除法方法
public int Divide(int num1, int num2)
{
return num1 / num2;
}
}
}
class Test
{
static void Main(string[] args)
{
Call objCall;//第二步:聲明委派物件
// Math 類的對象
SimpleMath objMath = new SimpleMath();
// 第三步:建立委派物件,將方法與委託關聯起來
objCall = new Call(objMath.Multiply);
Call objCall1 = new Call(objMath.Divide);
objCall += objCall1;//向委託增加一個方法
//objCall -= objCall1;//向委託減去一個方法
// 調用委託執行個體,先執行objMath.Multiply,然後執行objMath.Divide
int result = objCall(5, 3);
System.Console.WriteLine("結果為 {0}", result);
Console.ReadKey();
}
}
寫法:
1、委託 委託名=new 委託(會調用的方法名); 委託名(參數);
2、委託 委託名 =會調用的方法名; 委託名(參數);
3、匿名方法
委託 委託名=delegate(參數){會調用的方法體};委託名(參數);
4、拉姆達運算式
委託 委託名=((參數1,。。參數n)=>{會調用的方法體});委託名(參數);
5、用Action<T>和Func<T>,第一個無傳回值
Func<參數1, 參數2, 傳回值> 委託名= ((參數1,參數2) => {帶傳回值的方法體 });傳回值=委託名(參數1,參數2);
貼代碼:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using @delegate; namespace @delegate{ public delegate int Call(int num1, int num2); class SimpleMath { // 乘法方法 public static int Multiply(int num1, int num2) { return num1 * num2; } // 除法方法 public int Divide(int num1, int num2) { return num1 / num2; } } class Test { static void Main(string[] args) { //--------------------第一種寫法------------------------// //Call objCall = new Call(SimpleMath.Multiply); //Call objCall1 = new Call(new SimpleMath().Divide); //--------------------第二種寫法------------------------// //Call objCall = SimpleMath.Multiply; //Call objCall1 = new SimpleMath().Divide; //--------------------第三種寫法------------------------// //Call objCall = delegate(int a, int b) //{ // return a * b; //}; //Call objCall1 = delegate(int a, int b) //{ // return a / b; //}; //--------------------第四種寫法------------------------// //Call objCall =((int a,int b)=> { return a*b;}); //Call objCall1 = ((int a, int b) => { return a / b; }); //--------------------第五種寫法------------------------// Func<int, int, int> objCall = ((a, b) => { return a * b; }); Func<int, int, int> objCall1 = ((a, b) => { return a / b; }); Action<int, int> ob = ((a, b) => { Console.WriteLine(a * b); }); ob(5, 3); //----------------------------------------------------// int result = objCall(5, 3); int result1 = objCall1(5, 3); System.Console.WriteLine("結果1為 {0},結果2為{1}", result,result1); Console.ReadKey(); } }} |
C# 委託及各種寫法