从委托而起(二)认识委托
新建一个控制台应用程序,这个程序的作用是为一个字符串改变样子,所以起个名字叫Costumeball吧.嘉宾(字符串)通过一个个化妆间(函数)变得漂漂亮亮或奇奇怪怪后一起唱歌跳舞.好享受.
声明一个委托,委托一般出现在类之外,本例随便
delegate void Prink(string str);
创建与委托管理的方法,他们的签名必须一致
static void Upper(string str)
{
Console.WriteLine(str.ToUpper());
}
static void Lower(string str)
{
Console.WriteLine(str.ToLower());
}
static void Mark(string str)
{
Console.WriteLine("\""+str+"\"");
}
声明委托类型变量delegate void Prink(string str);,
Main方法代码如下:
static void Main(string[] args)
{
string str="FaTSo";
//进行委托绑定
prink = new Prink(Upper);
//回调方法
prink(str);
Console.ReadKey();
}
上述示例,在类内部声明了一个Prink委托类型.他具有和关联方法一样的签名(参数,返回值),否则会编译错误.将方法Upper传给了Prink构造函数,也就是将方法Upper指派给了Prink委托,并将其引用赋值给了prink变量,prink变量保存了Upper方法的指针,实现对Upper的回调.
再一个,在Main函数中添加下面代码:
prink = new Prink(Mark);
prink(str);
F5运行能看到prink(Mark)也得到了执行.先不管他怎么回事现在一起回忆下接口.写一个最简单接口的例子
interface IInterface
{
void SayHi();
}
class Student:IInterface
{
public void SayHi()
{
Console.WriteLine("我是学生");
}
}
class Teacher:IInterface
{
public void SayHi()
{
Console.WriteLine("我是老师");
}
}
在Main函数写上执行代码:
IInterface p1;
p1 = new Student();
p1.SayHi();
p1 = new Teacher();
p1.SayHi();
分别输出,我是学生,我是老师.
prink = new Prink(Upper);
prink(str);
prink = new Prink(Mark);
prink(str);
p1 = new Student();
p1.SayHi();
p1 = new Teacher();
p1.SayHi();
很像,有木有,有木有.
委托将方法当作参数进行传递,并根据传入的方法来动态的改变方法调用。只要为委托提供相同签名的方法,就可以与委托绑定.
而接口约束了实现接口的类所存在的方法,根据实例化类型找到该方法,接口保障了子类必须实现接口方法.
都可以实现统一方法的调用.委托是参数类型不同,接口类是实例化对象不同.简单的说,委托就是 一个方法容器,你能往里面放很多方法,然后统一调用,一个委托代表一个真实的方法。
多播委托,你让我干嘛,好我马上去做,你让我干嘛,好我马上去做.......
用+=和-=操作符分别进行绑定和解除绑定的操作,
public static void Main()
{
string str = "FaTSo";
prink += new Prink(Upper);
prink += new Prink(Mark);
prink += new Prink(Lower);
prink -= new Prink(Upper);
prink(str);
}
执行后依次输出 "FaTSo" fatso,事实上+=和-=操作分别调用了Deleagate.Combine和Deleagate.Remove方法,多播委托返回值一般都是void,委托类型非void时,多播委托将返回最后一个调用方法的执行结果.
委托的补充,回调方法真正的调用者是Invoke.可以在代码中显示调用
prink.Invoke(str);