委托
委托:其实就是一种命令,A委托B,做事情的是B
上面是在现实世界里,反过来在程序世界中的.
委托实际上就是存储了方法的地址,做事情的仍然是B
.net编程规范说明声明委托是以xxxxEventHandler结尾
委托的语法格式:
public + delegate关键字 + 方法返回值 + 委托名
class B
{
public void BuyThings(){
Console.WriteLine ("A委托B去买写生活用品");
}
public void BuyThingsTwo(){
Console.WriteLine ("A委托B去买写生活用品,two");
}
}
class A
{
//声明了一个委托
public delegate void BuyEventHandler();
public static void Main (string[] args)
{
//第一种关联委托方式
//实例化
BuyEventHandler buyHandler = new BuyEventHandler(new B().BuyThings);
//调用委托
buyHandler ();
//第二种关联委托方式
//在关联委托中可以使用 += 来绑定多个委托 也可以用-=取消绑定委托
//但是前提是委托非空、
B b = new B();
BuyEventHandler buyHandler;
buyHandler = b.BuyThingsTwo;
buyHandler += b.BuyThings;
//调用委托
buyHandler ();
事件
事件在类中声明且生成,且通过使用同一个类或其他类中的委托与事件处理程序关联。包含事件的类用于发布事件。这被称为 发布器(publisher) 类。其他接受该事件的类被称为 订阅器(subscriber) 类。事件使用 发布-订阅(publisher-subscriber) 模型。
发布器(publisher) 是一个包含事件和委托定义的对象。事件和委托之间的联系也定义在这个对象中。发布器(publisher)类的对象调用这个事件,并通知其他的对象。
订阅器(subscriber) 是一个接受事件并提供事件处理程序的对象。在发布器(publisher)类中的委托调用订阅器(subscriber)类中的方法(事件处理程序)。
class SendMarrayMessageMa
{
//申明委托
public delegate void SendEventHandler();
//为委托绑定事件
public event SendEventHandler OnPublisher;
public void Marry()
{
if(OnPublisher != null)
{
Console.WriteLine ("结婚");
OnPublisher ();
}
}
}
class A
{
public static void ReceiverMarryMessage()
{
Console.WriteLine ("好的1");
}
}
class B
{
public static void ReceiverMarryMessage()
{
Console.WriteLine ("好的2");
}
}
class MainClass
{
public static void Main (string[] args)
{
SendMarrayMessageMa sm = new SendMarrayMessageMa ();//实例化
sm.OnPublisher += A.ReceiverMarryMessage ;//为事件绑定方法,必须用+=或者-=
sm.OnPublisher += B.ReceiverMarryMessage ;
sm.Marry ();//调用事件
}
匿名函数,lambda表达式
public delegate void Mydel ();
public delegate void Mydel1 (string name);
public delegate string Mydel2(string name);
class MainClass
{
public static void Test(){
Console.WriteLine ("这是一个不带参数的委托");
}
public static void Main (string[] args)
{
// Mydel del = new Mydel (MainClass.Test);
// del ();
// del.Invoke ();
//匿名函数
// Mydel del1 ;
// del1 = delegate() {
// Console.WriteLine ("这是一个匿名函数");
// };
// del1 ();
//
// //带参数的匿名函数
// Mydel1 del2;
// del2 = delegate(string name) {
// Console.WriteLine ("hi " + name);
// };
// del2 ("张三");
//
//
//lamda表达式
// Mydel1 del3;
// del3 = (string name) => {
// Console.WriteLine ("hi " + name);
// };
// del3 ("李四");
Mydel2 del4;//带返回值的lambda表达式
del4 = (string name)=> name+"你好";
Console.WriteLine (del4("王五"));
}
}