举报投诉联系我们 手机版 热门标签 编程学
您的位置:编程学 > c#事件与委托 C# 事件

c#事件与委托 C# 事件

2023-02-25 22:18 C#教程

c#事件与委托 C# 事件

c#事件与委托

C#事件与委托是C#中一种重要的机制,它可以让程序员在不同的类之间进行消息传递,从而实现解耦。事件与委托是C#中一种强大的机制,它可以帮助我们实现面向对象的设计模式。

事件是一种特殊的函数,它可以在特定条件下被调用。当特定条件满足时,事件就会发生。例如,当用户单击某个按钮时,就会发生单击事件。

委托是一种特殊的数据类型,它可以存储方法的引用。当我们需要在不同的类之间进行方法调用时,就可以使用委托来存储方法的引用并把这个引用传递到其它类中去。

C#中的事件与委托是相关联的:当特定条件满足时(例如单击某个按钮时),就会发生一个事件;而这个事件激发时把存储在委托中的方法引用也传递到具体处理该事情的代码中去。

public delegate void MyDelegate(string message);  // 声明一个委托 
public event MyDelegate MyEvent;  // 声明一个事件 
public void DoSomething()  // 方法 
{ 
    if (MyEvent != null)  // 检测MyEvent是否有处理函数 
    { 
        MyEvent("Hello World!"); // 触发MyEvent, 并把"Hello World!"作为参数传递出去.  
    }  
}   

C# 事件

C#事件

事件系统是软件系统的核心部分。例如,按钮可以触发点击事件。批处理作业可以生成作业完成事件。学生系统将使用注册事件。

广播者是包含委托字段的类型。

广播者决定何时广播,通过调用委托。

订阅者是方法目标收件人。

订阅者通过在广播者的委托上调用+ =和 - =决定何时开始和停止侦听。

事件是一个C#语言功能,正式化这种模式。

例子

要声明事件,请将事件关键字放在代理成员的前面:

// a delegate
public delegate void ValueChangedHandler (decimal oldPrice, decimal newPrice);

public class Broadcaster {
   // Event declaration
   public event ValueChangedHandler PriceChanged;
}

Broadcaster 类型中的代码具有对 PriceChanged 的完全访问权限,可以将其视为代理。

Broadcaster 外部的代码只能对PriceChanged 事件执行+ =和 - =操作。


标准事件模式

.NET Framework定义了用于写入事件的标准模式。

System.EventArgs是一个没有成员的预定义的Framework类。

EventArgs 是一个承载事件信息的基类。

以下代码将 EventArgs 子类化,以启动PriceChanged 事件时存储旧价格和新价格:

public class PriceChangedEventArgs : System.EventArgs {
    public readonly decimal LastPrice;
    public readonly decimal NewPrice;
    public PriceChangedEventArgs (decimal lastPrice, decimal newPrice) {
        LastPrice = lastPrice;
        NewPrice = newPrice;
    }
}

EventArgs 子类根据其包含的信息命名。

它通常将数据作为属性或作为只读字段公开。

创建 EventArgs 子类之后,下一步是为事件定义一个委托,它是事件处理程序委托。

事件处理程序委托必须有一个void返回类型。

事件处理程序委托必须接受两个参数:第一个是类型对象,第二个是EventArgs的子类。

第一个参数指示事件广播者,第二个参数包含要传达的额外信息。

事件处理程序委托的名称必须以 EventHandler 结尾。

框架定义了一个称为 System.EventHandler<> 的通用委托,它满足这些规则:


public 
delegate 
void 
EventHandler<TEventArgs> (object source, TEventArgs e) 
where TEventArgs : EventArgs;

以下代码定义了我们的值更改事件的委托。

public delegate void ValueChangedHandler (object sender, PriceChangedEventArgs e);

下一步是定义所选委托类型的事件。

在这里,我们使用通用 EventHandler 委托:

public class Product {
    public event EventHandler<PriceChangedEventArgs> PriceChanged;
}

最后,该模式需要您编写一个受保护的虚拟方法来触发事件。

该名称必须与事件的名称匹配,前缀为单词On,并接受单个EventArgs参数:

public class Product {
    ...
    public event EventHandler<PriceChangedEventArgs> PriceChanged;
    protected virtual void OnPriceChanged (PriceChangedEventArgs e) {
        if (PriceChanged != null) PriceChanged (this, e);
    }
}

例2

这里是完整的例子:


using System;

public class PriceChangedEventArgs : EventArgs {
    public readonly decimal LastPrice;
    public readonly decimal NewPrice;

    public PriceChangedEventArgs (decimal lastPrice, decimal newPrice) {
        LastPrice = lastPrice; NewPrice = newPrice;
    }
}

public class Product {
    string symbol;
    decimal price;

    public Product (string symbol) {
       this.symbol = symbol;
    }
    
    public event EventHandler<PriceChangedEventArgs> PriceChanged;
    
    protected virtual void OnPriceChanged (PriceChangedEventArgs e) {
        if (PriceChanged != null) {
           PriceChanged (this, e);
        }
    }
    public decimal Price {
       get { 
          return price; 
       }
       set {
         if (price == value) return;
         decimal oldPrice = price;
         price = value;
         OnPriceChanged (new PriceChangedEventArgs (oldPrice, price));
      }
    }
}
class Test {
     static void Main()  {
        Product stock = new Product ("THPW");
        stock.Price = 2.10M;
        // Register with the PriceChanged event
        stock.PriceChanged += stock_PriceChanged;
        stock.Price = 3.9M;
     }
     static void stock_PriceChanged (object sender, PriceChangedEventArgs e) {
         if (e.NewPrice - e.LastPrice > 0){
             Console.WriteLine ("Alert!");
         }
     }
}

事件访问器和修饰符

事件的访问器是其 + = - = 函数。

默认情况下,访问器由编译器隐式实现。

像方法一样,事件可以是虚拟的,重写的,抽象的或密封的。

事件也可以是静态的:


public class Product {
    public static event EventHandler<EventArgs> StaticEvent;
    public virtual event EventHandler<EventArgs> VirtualEvent;
}
阅读全文
以上是编程学为你收集整理的c#事件与委托 C# 事件全部内容。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。
相关文章
  • c#索引器用的多吗 C# 索引器

    c#索引器用的多吗 C# 索引器

    2023-02-26 C#教程

    C# 索引器索引器提供了一个类似数组的语法来访问类或结构中的元素。索引器与属性类似,但可通过索引参数访问,而不是属性名称。...

  • c#转换16进制函数 C# 转换

    c#转换16进制函数 C# 转换

    2023-02-23 C#教程

    C# 转换转换和引用对象引用可以是:隐式向上转换为基类引用 显式地向下转换为子类引用 上传总是成功的;只有在对象正确键入时,向...

  • c#抽象类的定义 C# 抽象类

    c#抽象类的定义 C# 抽象类

    2023-02-27 C#教程

    C#抽象类抽象类是表示抽象概念的特殊类。例如,Integer是一个具体而Number是抽象的。形状是抽象的,而圆形是具体的。一个声明为...

  • 遗嘱房产继承怎么写 C# 继承的成员

    遗嘱房产继承怎么写 C# 继承的成员

    2023-02-24 C#教程

    C#继承的成员隐藏继承的成员基类和子类可以定义相同的成员。例如:public class A {public int Counter = 1; } public class B ...

  • typeof是什么意思 C# GetType和typeof

    typeof是什么意思 C# GetType和typeof

    2023-02-23 C#教程

    C#GetType和typeofC#中的所有类型都在运行时由System.Type的实例表示。有两种基本方法来获取System.Type对象:在实例上调用Get...

© 2024 编程学 bianchengxue.com 版权所有 联系我们
桂ICP备19012293号-7 返回底部