1, 什麼是委托?
答:委托即具有相同簽名和返回值類型的有序方法列表。
注意:
1> 方法的列表稱為調用列表(invocation list)。
2> 當委托被調用時,方法列表中的每一個方法都將被調用。
3> 委托是引用類型數據,因此有引用和對象。
2, 如何聲明委托?
delegate void MyDel(int x);
注:
1> delegate為關鍵字。
2> void表示返回類型,如果有返回值的話就是對應的返回類型,如int。
3> MyDel表示委托名稱。
4> MyDel(int x)表示簽名。
3, 創建委托對象的兩種方法?
方法1:使用帶new運算符的對象創建表達式。
MyDel del=new MyDel(ClassA.method1);
方法2:使用快捷語法,僅由類名和方法名構成,使用快捷語法是因為在方法名稱和其相應的委托類型之間有隱式轉換。
MyDel del=new ClassA.method1;
4, 委托調用?
1> 無返回值和參數的委托調用:
namespace delegate1
{
/*調用無返回值和參數的委托*/
delegate void PrintFunction(); //定義一個沒有返回值和參數的委托類型。
class Program
{
static voidMain(string[] args)
{
Test t = new Test();
PrintFunction pf;//創建一個空委托對象
pf = t.Print1;//初始化委托
pf += Test.Print2;//使用+=運算符為委托增加方法。注意靜態方法的調用方法(類名.方法名)。
pf += t.Print1;
pf += Test.Print2;
if (pf != null)//判斷委托中是否含有方法
{
pf(); //調用委托
}
else
{
Console.WriteLine("委托中沒有任何方法!");
}
Console.ReadKey();
}
}
class Test
{
public void Print1()
{
Console.WriteLine("Print1---實例化方法");
}
public static void Print2()
{
Console.WriteLine("Print2---靜態方法");
}
}
}
程序輸出結果為:
2> 帶返回值委托的調用:
namespace delegate2
{
/*調用帶返回值的委托*/
/*
1,調用方法列表中最後一個方法返回的值就是委托調用返回的值。
2,調用方法列表中所有其它方法的返回值都會被忽略。
*/
delegate int Mydel();
class Program
{
static voidMain(string[] args)
{
MyClass mc = new MyClass();
Mydel mDel = mc.Add2;
mDel += mc.Add3;
mDel += mc.Add2;
Console.WriteLine("Value:{0}",mDel());
Console.ReadKey();
}
}
class MyClass
{
int IntValue = 5;
public int Add2()
{
IntValue += 2;
return IntValue;
}
public int Add3()
{
IntValue += 3;
return IntValue;
}
}
}
程序輸出的結果為:
3> 帶引用參數的委托的調用:
namespace delegate3
{
/*調用帶引用參數的委托*/
/*
1,在調用委托列表中的下一個方法時,參數的新值(不是初始值)會傳給下一個方法。
*/
delegate void MyDel(ref int x);
class Program
{
static voidMain(string[] args)
{
MyClass mc = new MyClass();
MyDel mDel = mc.Add2;//Add2(x=5)
mDel += mc.Add3;//Add3(x=7)
mDel += mc.Add2;//Add2(x=10)
int x = 5;
mDel(ref x);
Console.WriteLine("委托mDel的值為:{0}",x);
Console.ReadKey();
}
}
class MyClass
{
public void Add2(ref int x)
{
x += 2;
}
public void Add3(ref int x)
{
x += 3;
}
}
}
程序的輸出結果為:
4> 匿名方法和lambda表達式:
匿名方法定義:匿名方法是在初始化委托時內聯(inline)聲明的方法。
namespace delegate4
{
/*匿名方法和lambda表達式*/
delegate double MyDel(int par);
class Program
{
static voidMain(string[] args)
{
MyDel del = delegate(int x) { return x + 1; };//匿名方法。
MyDel le1 = (int x) => { return x + 1; };//lambda表達式。省略關鍵字delegate
MyDel le2 = (x) => { return x + 1; };//lambda表達式。省略類型參數,因為編譯器可以從委托的聲明中知道委托參數的類型。
MyDel le3 = x => { return x + 1; };//lambda表達式。省略圓括號,因為只有一個隱式類型參數。
MyDel le4 = x => x + 1;//lambda表達式。省略語句塊。
Console.WriteLine("委托del的值為:{0}", del(12));
Console.WriteLine("委托le1的值為:{0}", le1(12));
Console.WriteLine("委托le2的值為:{0}", le2(12));
Console.WriteLine("委托le3的值為:{0}", le3(12));
Console.WriteLine("委托le4的值為:{0}", le4(12));
Console.ReadKey();
}
}
}
程序輸出結果為:
以上是我對委托的理解和總結,各位園友們如果覺得總結得還不錯的話請給點鼓勵,如果覺得還有不足的地方也歡迎指證,讓我們一起努力吧,加油!