您的位置:首页 > 编程语言 > C#

C#事件学习

2017-12-17 15:41 162 查看

C#事件

事件的作用

事件是.Net中最常用的OOP技术之一。事件可以提供一个实现这样一个功能:当事件被触发的时候,依次执行订阅了该事件的代码。单个事件可以供多个处理程序订阅。



定义和订阅事件

事件的基础是委托。每一个事件都有自己的返回类型和参数,由声明事件时所指定的委托类型确定。例如:

using System;
using System.Collections.Generic;

public delegate void MessageHandler(string messageText);//定义一个委托
public class Connection
{
public event MessageHandler MessageArrived//定义一个事件
}


接下来我们可以创建一个方法,返回值和参数与我们上面定义的事件相同。

public class Display
{
public void DisplayMessage(string message) => WriteLine($"Message arrived: {message}");
}


定义完方法后,我们就可以在主函数或其他地方订阅事件。

class Program
{
static void Main(string[] args)
{
myConnection.MessageArrived +=
new MessageHandler(myDisplay.DisplayMessage);
}
}


触发事件

接下来,我们需要触发事件来让事件执行订阅了它的方法。

//判断是否有方法订阅了该事件
if (MessageArrived != null)
{
MessageArrived("Hello Mami!");//触发
}


泛型EventHandler<T>

EventHandler<T>是泛型委托类型,它的原型定义如下

public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e);
}


第一个参数为引发事件的对象的引用,第二个参数为由事件传送的参数,这个参数只要是派生自System.EventArgs即可。

下面是一个例子:

//事件的参数
public class MessageArrivedEventArgs : EventArgs
{
private string message;

public string Message
{
get { return message; }
}

public MessageArrivedEventArgs()
{
message = "No message sent.";
}

public MessageArrivedEventArgs(string newMessage)
{
message = newMessage;
}
}
//要订阅事件的方法
public class Display
{
public void DisplayMessage(object source, MessageArrivedEventArgs e)
{
WriteLine($"Message arrived from: {((Connection)source).Name}");
WriteLine($"Message Text: {e.Message}");
}
}
static void Main(string[] args)
{
public event EventHandler<MessageArrivedEventArgs> MessageArrived;
MessageArrived += myDisplay.DisplayMessage;//订阅事件
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c#