这个视频对于C#中事件和委托(代理)的讲解和示例讲得很清晰明了。
首先创建一个EventAndDelegates
的C# .Net控制台程序,然后输入对应的代码,运行。
Video.cs
using System;
namespace EventAndDelegates
{
public class Video
{
public String Title { get; set; }
}
}
VideoEncoder.cs
using System;
using System.Threading;
namespace EventAndDelegates
{
public class VideoEventArgs : EventArgs
{
public Video Video { get; set; }
}
public class VideoEncoder
{
// 1- Define a delegate
// 2- Define an event based on that delegate
// 3- Raise the event
// C#中的代理delegate有些类似于C++中的函数指针
//public delegate void VideoEncodedEventHandler(object source, VideoEventArgs e);
//public event VideoEncodedEventHandler VideoEncoded;
// EventHandler
// EventHandler<TEventArgs>
public EventHandler<VideoEventArgs> VideoEncoded;
public void Encode(Video video)
{
Console.WriteLine("Encoding Video..." + video.Title);
Thread.Sleep(3000);
OnVideoEncoded(video);
}
protected virtual void OnVideoEncoded(Video video)
{
if (VideoEncoded != null)
{
VideoEncoded(this, new VideoEventArgs { Video = video });
}
}
}
}
MailSerive.cs
using System;
namespace EventAndDelegates
{
public class MailService
{
public void OnVideoEncoded(object source, VideoEventArgs args)
{
Console.WriteLine("MailService: Send an email..." + args.Video.Title);
}
}
}
MessageService.cs
using System;
namespace EventAndDelegates
{
public class MessageService
{
public void OnVideoEncoded(object source, VideoEventArgs e)
{
Console.WriteLine("MessageService: Send an text message..." + e.Video.Title);
}
}
}
Program.cs
using System;
namespace EventAndDelegates
{
public class Program
{
static void Main(string[] args)
{
var video = new Video() { Title = "Video 1" };
var videoEncoder = new VideoEncoder(); // publisher
var mailService = new MailService(); // subscriber
var messageService = new MessageService();
videoEncoder.VideoEncoded += mailService.OnVideoEncoded;
videoEncoder.VideoEncoded += messageService.OnVideoEncoded;
videoEncoder.Encode(video);
}
}
}
程序运行结果如下图所示: