委托:其实就是一种命令,A委托B,做事情的就是B
* 上面是在现实世界里,反过来在程序世界中的
* 委托实际上就是存储了方法的地址,做事情的任然是B
* .net,编程规范说明声明委托是以XXXXEventHandler结局
* 委托的语法格式:
* public+delegate关键字+方法返回值+委托名
事件:事件就是类在发生一些事情的时候通知其他类的一种方式
* 事件一般会牵扯到俩个角色
* 1.事件发起者(sender/publisher):实际上就是事件的发行者
* 2.事件订阅者(Receiver):对发起者发的通知感兴趣的话,就可以选择订阅该事件
*
* 事件绝大部分都要和委托连用
*
* 匿名函数 --》不记名函数 C#2.0引进的
* lambda表达式 C#3.0引进的
*
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)
{
第1种委托方法
//实例化
BuyEventHandler buyEventHandler=new BuyEventHandler(new B().BuyThings);
//调用委托
buyEventHandler ();
第二种委托方法
在关联委托中可以使用+=来绑定多个委托,也可以-=取消绑定委托
但是前提是委托非空
B b=new B();
BuyEventHandler buyEventHandler;
buyEventHandler = b.BuyThingsTwo;
buyEventHandler += b.BuyThings;
buyEventHandler -= b.BuyThings;
buyEventHandler -= b.BuyThingsTwo;
调用委托
buyEventHandler ();
}
}
事件
//声明一个委托
public delegate void SenderEventHandler();
class SendMarryMessageMa
{
//声明一个委托
// public delegate void SenderEventHandler();
//为委托绑定事件
public event SenderEventHandler OnPublisher;
public void Marry(){
if (OnPublisher != null) {
Console.WriteLine ("我又结婚了,各位请准时到场,钱准备好.");
OnPublisher ();
}
}
}
interface C
{
void ReceiverMarryMessage();
}
abstract class CC:C
{
abstract public void ReceiverMarryMessage();
}
class A:CC
{
override public void ReceiverMarryMessage(){
Console.WriteLine ("好的,小蛇,准时到~");
}
}
class B:CC
{
override public void ReceiverMarryMessage(){
Console.WriteLine ("行行行,去");
}
}
class MainClass
{
public static void Main (string[] args)
{
//1.实例化发这者
SendMarryMessageMa sm = new SendMarryMessageMa ();
//2.绑定订阅者
// sm.OnPublisher += c.ReceiverMarryMessage;
// sm.OnPublisher += c2.ReceiverMarryMessage;
sm.OnPublisher += MainClass.ReturnDelegate (new A ());
sm.OnPublisher += MainClass.ReturnDelegate (new B());
//3.执行
sm.Marry();
}
public static SenderEventHandler ReturnDelegate(CC c)
{
return c.ReceiverMarryMessage;
}
}
lambda表达式
声明一个不带参数的委托
delegate void Mydelegate();
声明一个带参数的委托
public delegate void Mydelegate(string name);
// 声明一个带参数带返回值的委托
/public delegate string
/Mydelegate(string name);
public static void Text()
{
Console.WriteLine ("不带参数的委托");
}
// public static void Main (string[] args)
{
Mydelegate d0 = new Mydelegate (MainClass.Text);
d0.Invoke ();
匿名函数--callback回调函数
Mydelegate d1;
d1 = delegate (){
Console.WriteLine ("这是一个匿名函数");
};
d1 ();
带参数的匿名函数
Mydelegate d2;
d2 = delegate(string name) {
Console.WriteLine ("hi--"+name);
};
d2 ("你好");
// //lamda表达式
Mydelegate d3;
d3 = (string name) => {
Console.WriteLine ("hi--"+name);
};
d3 ("long");
// //带参数带返回值
Mydelegate d4;
d4=(string name)=>name+"你好";
Console.WriteLine (d4("中国"));
}