委托
委托:是一個(gè)類肢专、是一種數(shù)據(jù)類型
定義語(yǔ)法: 訪問(wèn)修飾符 關(guān)鍵字(delegate) 返回值 標(biāo)識(shí)符(參數(shù)列表)
委托的綁定:和委托的返回值一樣,參數(shù)一樣的方法都可以綁定到此委托
委托鏈的使用:通過(guò)+=刹悴、-=給委托鏈添加和刪除一個(gè)綁定方法。
委托使用之前需要先定義
三種使用方式:
1.直接方法賦值使用
2.匿名函數(shù)使用:
匿名函數(shù)法:delagate + 參數(shù) + 方法體{return 返回值默認(rèn)值狈邑;}
3.Lambda表達(dá)式使用:
格式:(參數(shù))=>{}
當(dāng)只有一個(gè)參數(shù)政鼠,一個(gè)返回值的時(shí)候,寫(xiě)Lambda表達(dá)式時(shí)律姨,可以將參數(shù)的小括號(hào)振峻、參數(shù)的類型省略,將方法大括號(hào)择份,return語(yǔ)句的return也省略扣孟,語(yǔ)句后的分號(hào)也可以省略。
namespace 委托
{
delegate void MyDelegate();
class Program
{
static void Main(string[] args)
{
Person person = new Person();
person.SayHello(Fun);
}
static void Fun()
{
Console.WriteLine("xixi");
}
}
class Person
{
public void SayHello(MyDelegate dele)
{
dele();
}
}
}
//創(chuàng)建委托對(duì)象
MyDelegate dele1 = new MyDelegate(Fun);
MyDelegate dele2 = Fun;
MyDelegate dele3 = dele1;
//調(diào)用委托對(duì)象
dele1();
dele2();
dele3();
委托:一個(gè)委托對(duì)象可以綁定多個(gè)方法,只要方法簽名和其一致即可以綁定,委托對(duì)象在調(diào)用時(shí),會(huì)依次執(zhí)行綁定的方法,卸載未曾綁定的方法不會(huì)報(bào)錯(cuò).
... ...
ColDelegate col = new ColDelegate(Add);
col += Sub;
col -= Add;
Console.WriteLine(col (5, 10));
}
static int Sub(int a, int b)
{
return a - b;
}
static int Add(int a, int b)
{
return a + b;
}
委托中方法的表現(xiàn)形式
除了常規(guī)的表現(xiàn)形式還有匿名函數(shù)和Lambda表達(dá)式
//匿名函數(shù):delegate(形參列表){}
Person student11 = new Person();
student11.SayHello(delegate () { Console.WriteLine("222"); });
ColDelegate col2 = delegate (int a, int b) { return a / b; };
Console.WriteLine(col2(20,10));
//Lambda 表達(dá)式
//省略某些元素:當(dāng)只有一個(gè)參數(shù)時(shí),可以只寫(xiě)形參,
//當(dāng)方法體為一條有返回值的語(yǔ)句,可以省略{}和return 關(guān)鍵字
StrDelegate myStr = (int a) => { return a.ToString(); };
StrDelegate str = a => a.ToString();
通過(guò)委托來(lái)實(shí)現(xiàn)前面的排序,以實(shí)現(xiàn)我們可以隨意定義兩個(gè)比較的是什么東西
委托的兩個(gè)參數(shù)為泛型以此來(lái)實(shí)現(xiàn),任意類型
delegate bool ComAmyObj<T>(T a,T b);
//對(duì)任意可比較類型數(shù)據(jù)進(jìn)行升序排序
class MyClass01
{
public T[] ArraySort<T>(T[] t,ComAmyObj<T> comAmyObj) //where T : IComparable
{
if (t.Length > 1)
{
for (int n = 0; n < t.Length; n++)
{
for (int m = 0; m < t.Length - n - 1; m++)
{
//如果前者大于后者
if (comAmyObj(t[m], t[m + 1]))
{
T temp = t[m + 1];
t[m + 1] = t[m];
t[m] = temp;
}
}
}
}
return t;
}
}
class Program
{
static void Main(string[] args)
{
MyClass02[] c1 = new MyClass02[3];
c1[0] = new MyClass02();
c1[0].i = 11110;
c1[1] = new MyClass02();
c1[1].i = 230;
c1[2] = new MyClass02();
c1[2].i = 10;
MyClass01 c3 = new MyClass01();
// c1 = c3.ArraySort<MyClass02>(c1);
c1 = c3.ArraySort<MyClass02>
(c1, (MyClass02 i, MyClass02 j) => { if (i.i > j.i) { return true; } else return false; });
Console.WriteLine(c1[0].i);
Console.WriteLine(c1[1].i);
Console.WriteLine(c1[2].i);
}
}
事件
event是一種定義好的數(shù)據(jù)類型荣赶,對(duì)委托對(duì)象實(shí)現(xiàn)封裝凤价,保護(hù)委托對(duì)象不被直接復(fù)制修改鸽斟。在非聲明事件的類,只可以用+=利诺、-=的方式富蓄,掛載、卸載事件慢逾。
聲明語(yǔ)法:訪問(wèn)修飾符 event 委托 名字立倍;