委托:
1.说明:
声明定义一种类型,它用一组特定的参数以及返回类型来封装方法。
---对于静态方法,委托对象封装要调用的方法。
---对于实例方法,委托对象同时封装一个实例和实例上的一个方法。
如果您有一个委托对象和一组适当的参数,就可以用这些参数调用改委托。
2.和函数指针比较
---完全的面向对象,使用安全的类型。
---允许在运行时,传入函数名称,动态决定调用的方法。
---委托实际上是一个类,任何可以声明类的地方,都可以声明委托。
3.委托的使用
声明:delegate 函数返回值 委托名称(函数参数列表)
使用:委托名称 委托变量 = new 委托名称(委托实例)
Eg:
delgegate void DelEat(string food)
static void zsEat(string food)
{
....
}
static void lsEat(string food)
{
....
}
DelEat zs = new DelEat(zsEat);
DelEat ls = new DelEat(lsEat);
4.委托链
---可以直接对委托变量建立链表,实现其增加或者删除。
Eg:
DelEat delchain;
delchain = zs + ls;
delchain("Apple");
delchain -=ls;
delchain("Banana");
5.匿名方法
DelEat delchain =null;
delchain += delegate(string food){console.writeLine("张三吃"+food);};
delchain += delegate(string food){console.writeLine("李四吃"+food);};
delchain("Apple");
6.实例方法
class Man
{
private string name;
public Man(string name) //constructor
{
this.name = name;
}
public void SayWords(string words)
{
Console.WriteLine(name + "said : " + words);
}
}
class In
{
public static void SayManyWords(string words,params ManSay[] manset)
{
if(manset != null) //必须判断
foreach (ManSay m in manset)
{
m(words);
}
}
static void Main()
{
Man zs = new Man("zhang san ");
Man ls = new Man("li si");
//向很多人说东西
ManSay delzs= new ManSay(zs.SayWords);
ManSay dells = new ManSay(ls.SayWords);
SayManyWords("HI", delzs, dells);
SayManyWords("Nothing", null);
}
}