首页 > 编程语言 >C# 事件(event)

C# 事件(event)

时间:2023-03-07 13:22:41浏览次数:49  
标签:Console C# void EventDemo PrintEvent event 事件 public

C# 事件(event)

 

事件是一种特殊的多播委托,仅可以从声明事件的类或结构中对其进行调用。类或对象可以通过事件向其他类或对象通知发生的相关事情。 发送(或引发)事件的类称为“发布者”,接收(或处理)事件的类称为“订阅者”。本文主要介绍C# 事件(event)。

 

1、事件

事件是一种专门的代表类型,主要用于消息或通知传递。事件只能从它们发布的类型调用,通常基于EventHandler委托,其中对象代表事件的发送方,System.EventArgs派生类保存有关事件的数据。实现事件和回调方法都是基于委托(delegate)。

2、事件的声明

 

 

相关文档C# 委托(delegate)

 

声明事件需要先声明该事件的委托型类,通过声明的委托类型和event关键字来声明事件。

例如,

public delegate void ClickEventHandler(string args);
// 基于上面的委托定义事件
public event ClickEventHandler ClickEvent;

以上代码简单实现了事件ClickEvent的定义,该事件在声明的时会调用委托。下面看一下通过“订阅者”和“发布者”类实现的完整示例:

例如,

using System;
namespace SimpleEvent
{
  using System;
  /***********发布器类***********/
  public class EventDemo
  {
    private string message;
    public delegate void PrintEventHandler();

    public event PrintEventHandler PrintEvent;
    protected virtual void OnPrinted()
    {
      if ( PrintEvent != null )
      {
        PrintEvent(); /* 事件被触发 */
      }else {
        Console.WriteLine( "事件没被触发" );
        Console.ReadKey(); /* 回车继续 */
      }
    }

    public EventDemo()
    {
      PrintMessage("cjavapy");
    }

    public void PrintMessage( string s )
    {
        message=s;
        OnPrinted();
    }
  }

  /***********订阅器类***********/
  public class SubscribEvent
  {
    public void Print()
    {
      Console.WriteLine( "触发事件" );
      Console.ReadKey(); /* 回车继续 */
    }
  }
  /***********触发***********/
  public class MainClass
  {
    public static void Main()
    {
      EventDemo e = new EventDemo(); /* 实例化对象,第一次没有触发事件 */
      SubscribEvent s = new SubscribEvent(); /* 实例化对象 */
      e.PrintEvent += new EventDemo.PrintEventHandler(s.Print); /* 注册 */
      e.PrintMessage("C#");
      e.PrintMessage("Java");
    }
  }
}

上面示例的事件没有参数,下面看一下委托事件带有参数的情况:

例如,

using System;
namespace SimpleEvent
{
  using System;
  /***********发布器类***********/
  public class EventDemo
  {
    private string message;
    public delegate void PrintEventHandler(string args);

    public event PrintEventHandler PrintEvent;
    protected virtual void OnPrinted(string s)
    {
      if ( PrintEvent != null )
      {
        PrintEvent(s); /* 事件被触发 */
      }else {
        Console.WriteLine( "事件没被触发" );
        Console.ReadKey(); /* 回车继续 */
      }
    }

    public EventDemo()
    {
      PrintMessage("cjavapy");
    }

    public void PrintMessage( string s )
    {
        message=s;
        OnPrinted(s);
    }
  }

  /***********订阅器类***********/
  public class SubscribEvent
  {
    public void Print(string s)
    {
      Console.WriteLine( "触发事件" );
      Console.WriteLine( s );
      Console.ReadKey(); /* 回车继续 */
    }
  }
  /***********触发***********/
  public class MainClass
  {
    public static void Main()
    {
      EventDemo e = new EventDemo(); /* 实例化对象,第一次没有触发事件 */
      SubscribEvent s = new SubscribEvent(); /* 实例化对象 */
      e.PrintEvent += new EventDemo.PrintEventHandler(s.Print); /* 注册 */
      e.PrintMessage("C#");
      e.PrintMessage("Java");
    }
  }
}

标签:Console,C#,void,EventDemo,PrintEvent,event,事件,public
From: https://www.cnblogs.com/GaoUpUp/p/17187795.html

相关文章

  • C# 委托(delegate)
    C#委托(delegate)委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-El......
  • RocketMQ高可用机制
    RocketMQ高可用机制集群部署模式1.单master模式2.多master模式配置配置文件broker.properties的brokerClusterName需要保持一致brokerId需要为0,0代表为0优缺点......
  • C# break和continue关键字
    C#break和continue关键字break跳出最里层的循环,并且继续执行该循环下面的语句。continue适用于任何循环控制结构中。作用是让程序立刻跳转到下一次循环的迭代......
  • C# 方法
    C#方法在C#的语言中,方法相当于其它语言中的函数,但是它与传统的函数也有着明确的不同:在结构化的语言中,整个程序是由一个个函数组成的;但是在面向对象的语言里,整个......
  • C# 方法 重载
    C#方法重载在C#的语言中,方法相当于其它语言中的函数,但是它与传统的函数也有着明确的不同:在结构化的语言中,整个程序是由一个个函数组成的;但是在面向对象的语言......
  • C# 方法 参数
    C#方法参数在C#的语言中,方法相当于其它语言中的函数,但是它与传统的函数也有着明确的不同:在结构化的语言中,整个程序是由一个个函数组成的;但是在面向对象的语言里......
  • C# 作用域
    C#作用域在C#里,作用域是由花括号的位置决定的。C#用一对大括号作为语句块的范围,称为作用域,在作用域里定义的变量,只有在该作用域结束之前才可使用。本文主要介......
  • C# 面向对象编程(OOP)
    C#面向对象编程(OOP)C#是面向对象的编程语言,对象就是面向对象程序设计的核心。所谓对象就是真实世界中的实体,对象与实体是一一对应的,也就是说现实世界中每一个......
  • CMake基本使用
    1、cmakecmake是用于构建、测试和软件打包的跨平台工具2、优势避免硬编码路径可在多台计算机上构建一个包可做持续集成支持不同操作系统支持多个编译器可使用IDE......
  • C# 递归
    C#递归递归就是把规模大的问题转化为规模小的相似的子问题来解决。在函数实现时,因为解决大问题的方法和解决小问题的方法往往是同一个方法,所以就产生了函数调用......