学习随笔1 委托和事件

以下来源于CSDN论坛,收集之后做为自己学习笔记,以便翻阅。

public delegate void PrintHandler(string str); // 声明委托类型

  public class PrintStr
  {  
  public void CallPrint(string input)
  {
  Console.WriteLine(input);
  }
   
  }
static void Main(string[] args)
{
  PrintStr myPrinter = new PrintStr();
  PrintHandler myHandler = null;
  // 将委托链接到方法,来实例化委托
  myHandler += new PrintHandler(myPrinter.CallPrint); 

  if (myHandler != null)
  myHandler("Hello World!"); // 调用委托,相当于匿名调用委托所链接的方法
  myHandler -= new PrintHandler(myPrinter.CallPrint);
  if (myHandler == null)
  Console.WriteLine("myHandler==null");
  Console.Read();


得到的结果为
Hello World!
myHandler==null

 

二、委托的特点
1、一个委托对象可以搭载多个方法。
2、一个委托对象搭载的方法并不需要属于同一个类,但所搭载的方法必须具有相同的原形和形式。
3、委托的实例将代表一个具体的函数

4、C#中的事件模型。用他们指明处理给定事件的方法。
下面我们详细来介绍事件。
四、事件
事件允许类型(或者类型的实例)在某些特定事情发生的时候通知其他对象。
例如button类定义了一个名为click的事件,当buton对象被点击时,应用程序中的一些对象可能希望能够收到一个通知,并执行一些动作。但问题是当我们编写button类的时候并不知道到底要做什么,到底要调用哪些方法,我们只要在使用button的场景才知道到底应该在按下button时做些什么,基于这样的情况,我们想起了委托,我们先在button类中定义一个委托,然后在使用button的相应场景注册这个委托即可,似乎用委托就解决了这个问题了,那事件还有什么用呢,也就是说委托和事件的区别在哪里呢,其实事件就是一种特殊的委托,使用事件委托的类型,必须使用+=进行注册而不能用=,这样做的原因是事件中已经注册的方法不希望被新注册的方法覆盖掉。微软为使用事件定义了一个模式。
事件模式由以下五步组成:
1、定义一个类型用于保存所有需要发送给事件通知接受者的附加信息(继承于System.EventArgs)
2、定义一个委托类型,用于指定事件触发时被调用的方法类型
3、定义一个事件成员
4、定义一个受保护的虚方法,负责通知事件的登记对象
5、定义一个方法,将输入转化为期望的事件
我们这里举一个发Email的时候触发事件的例子:

Code
public class MailManager
  {

  //1、定义一个类型用于保存所有需要发送给事件通知接受者的附加信息(继承于System.EventArgs)

  public class MailMsgEvernArgs : EventArgs
  {
  public MailMsgEvernArgs( string from,string to,string subject,string body)
  {
  this.from = from;
  this.to = to;
  this.subject = subject;
  this.body = body;
   
  }
  public readonly string from,to,subject,body;
   
  }

  //2、定义一个委托类型,用于指定事件触发时被调用的方法类型

  public delegate void MailMsgEventHandler(object sender,MailMsgEvernArgs args);

  //3、定义一个事件成员

  public event MailMsgEventHandler MailMsg;

  //4、定义一个受保护的虚方法,负责通知事件的登记对象

  protected virtual void OnMailMsg(MailMsgEvernArgs e)
  {
  if(MailMsg!=null)
  MailMsg(this,e);
  }
  //5、定义一个方法,将输入转化为期望的事件
  public void SimulateArrivingMsg(string from,string to,string subject,string body)
  {
  MailMsgEvernArgs e = new MailMsgEvernArgs(from,to,subject,body);
  OnMailMsg(e);
  }
  }
static void Main(string[] args)
{  
  MailManager mm = new MailManager();
  mm.MailMsg += new MailManager.MailMsgEventHandler(mm_MailMsg);
  mm.MailMsg += new MailManager.MailMsgEventHandler(mm_MailMsg1);
  mm.SimulateArrivingMsg("中国", "美国", "subject", "body");
}
private static void mm_MailMsg(object sender, MailManager.MailMsgEvernArgs args)
{

  Console.WriteLine(args.from);
  Console.WriteLine(args.to);
}
private static void mm_MailMsg1(object sender, MailManager.MailMsgEvernArgs args)
{

  Console.WriteLine(args.subject);
  Console.WriteLine(args.body);
}

例子1

publicclass Test
{
publicdelegatevoid NewDelegate();
public NewDelegate TestDelegate;//委托
publicstaticevent TestDelegate TestEvent;//事件

//比如你有一个按钮的CLICK响应时间,你就可以在这里调用
privatevoid Button1_Click(object sender, EventArgs e)
{
   TestDelegate();
//执行委托
   TestEvent();//执行事件
}
}


public Class Test2
{
Test test
=new Test();
test.TestDelegate
=this.DoSomeThing;
Test.TestEvent
+=new Test.TestDelegate(DoSomeThing);
void DoSomeThing()
{
  
//you can do something here
}
}

原文地址:https://www.cnblogs.com/hiflora/p/2693630.html