戳人痛处

导航

[记]C#的委托和事件

一、委托

 委托的关键字是delegate;

 声明委托:

public delegate void printString(string s);

委托的传入参数是 string,但是在实际使用时是传入函数方法;

      static void Main(string[] args)
      {
        // printString ps;
         printString ps1 = new printString(WriteToScreen);
         printString ps2 = new printString(WriteToFile);
        //  ps=ps1;
         ps1+=ps2;
         ps1("hhello");
         Console.ReadKey();
      }

实例化的委托以方法传入,每个方法的传入参数需与委托的定义参数一致;

当使用+=运算符将多个实例化委托添加到ps1时,只需要调用ps1即可同时对多个委托进行处理;

using System;
using System.IO;

namespace DelegateAppl
{
   class PrintString
   {
      static FileStream fs;
      static StreamWriter sw;
      // 委托声明
      public delegate void printString(string s);

      // 该方法打印到控制台
      public static void WriteToScreen(string str)
      {
         Console.WriteLine("The String is: {0}", str);
      }
      // 该方法打印到文件
      public static void WriteToFile(string s)
      {
         fs = new FileStream("d:\\message.txt", FileMode.Append, FileAccess.Write);
         sw = new StreamWriter(fs);
         sw.WriteLine(s);
         sw.Flush();
         sw.Close();
         fs.Close();
      }
      // 该方法把委托作为参数,并使用它调用方法
      public static void sendString(printString ps)
      {
         ps("Hello World");
         ps("time--");
      }
      static void Main(string[] args)
      {
        // printString ps;
         printString ps1 = new printString(WriteToScreen);
         printString ps2 = new printString(WriteToFile);
        //  ps=ps1;
         ps1+=ps2;
         sendString(ps1);
         Console.ReadKey();
      }
   }
}
View Code

二、事件

事件常和委托一起使用;

在定义委托后才能定义调用委托的事件;

public delegate void NumManipulationHandler(int num);
public event NumManipulationHandler ChangeNum;

事件可以添加多个委托,当事件触发时,多个委托方法也同时调用;

public static void Main()
    {
      EventTest e = new EventTest(); /* 实例化对象,第一次没有触发事件 */
      MainClass pp = new MainClass();
      e.ChangeNum += new EventTest.NumManipulationHandler(pp.printf); /* 注册 */
      e.SetValue( 7 );
      e.SetValue( 11 );
    }

激活事件则是通过调用事件函数,给事件名后面添加小括号;

using System;
namespace SimpleEvent
{
  using System;
  public class EventTest
  {
    private int value;
    public delegate void NumManipulationHandler(int num);
    public event NumManipulationHandler ChangeNum;
    public EventTest()
    {
      int n = 5;
      SetValue( n );
    }
    public void SetValue( int n )
    {
      if ( value != n )
      {
        value = n;
        if(ChangeNum!=null){
            ChangeNum(n);
        }
      }
    }
  }

  public class MainClass
  {
    public void printf(int num)
    {
        Console.WriteLine(num.ToString());
        Console.WriteLine( "event fire" );
        Console.ReadKey(); /* 回车继续 */
    }
    public static void Main()
    {
      EventTest e = new EventTest(); /* 实例化对象,第一次没有触发事件 */
      MainClass pp = new MainClass();
      e.ChangeNum += new EventTest.NumManipulationHandler(pp.printf); /* 注册 */
      e.SetValue( 7 );
      e.SetValue( 11 );
    }
  }
}
View Code

 

posted on 2022-07-12 15:40  戳人痛处  阅读(19)  评论(0编辑  收藏  举报