c#的event使用(1)
·
在C#中,事件是一种用于在类或对象之间进行通信的机制。当某个特定的事件发生时,与该事件相关联的方法(称为事件处理程序)将被调用。
下面是使用C#事件的基本步骤:
- 定义事件:在类中定义一个事件成员变量,并使用
event关键字声明事件。例如:
public event EventHandler MyEvent;
- 触发事件:当需要触发事件时,调用事件的
Invoke方法。例如:
MyEvent?.Invoke(this, EventArgs.Empty);
- 订阅事件:在另一个类中,使用
+=运算符订阅事件。例如:
public class MyClass
{
public void Subscribe()
{
MyEvent += MyEventHandler;
}
private void MyEventHandler(object sender, EventArgs e)
{
// 处理事件
}
}
- 取消订阅事件:使用
-=运算符取消订阅事件。例如:
public class MyClass
{
public void Unsubscribe()
{
MyEvent -= MyEventHandler;
}
}
在上面的示例中,MyEvent是一个事件成员变量,它是一个EventHandler类型的委托。当需要触发事件时,使用MyEvent?.Invoke(this, EventArgs.Empty);语句调用事件处理程序。在另一个类中,使用MyEvent += MyEventHandler;语句订阅事件,并在MyEventHandler方法中处理事件。使用MyEvent -= MyEventHandler;语句取消订阅事件。
有事件到来的时候,会触发相应的注册的事件处理函数。可参见设计模式之观察者模式
下面是經典的燒水例子:
//如果自動逸的話,想知道實際發起者可以在event中定義
class SimpleEvent: EventArgs{
// public SimpleEvent(Heater program){
// this.source = program;
// }
// public Heater source {get; private set;}
}
class Heater{
public delegate void SimpleDelegate(object sender, SimpleEvent evnt);
public static event SimpleDelegate? waterBoiled;
public void BoilWater(){
for (int i = 0; i < 100; i++){
Console.WriteLine($"HEATER THREAD:{Thread.CurrentThread.ManagedThreadId}");
Console.WriteLine($"Boiling water: {i}");
if (i > 10){
if (waterBoiled != null){
// 兩種方式都可以
waterBoiled(this, new SimpleEvent());
//waterBoiled.Invoke(this, new SimpleEvent());
break;
}
}
}
}
}
class Program
{
static void Main(string[] args)
{
Heater heater = new Heater();
Heater.waterBoiled += Mama.Washing;
heater.BoilWater();
}
}
class Mama{
public static void Washing(object sender, SimpleEvent se){
Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
Console.WriteLine($"Mama says hello from {sender.GetType().Name}!");
}
}
事件驅動的思想,可以解耦事件的處理者和發起者
更多推荐



所有评论(0)