1. 事件概述
在C#编程中,事件是一种使对象能够发布和接收消息的机制。事件通常用于实现观察者设计模式,其中一个对象(称为发布者)发布事件,而其他对象(称为订阅者)订阅该事件以接收通知。
2. 事件参数(object sender, EventArgs e)
在C#事件中,两个常见的参数是object sender和EventArgs e。这两个参数提供了关于事件的重要信息,允许订阅者对事件做出响应。
2.1 object sender
object sender参数表示触发事件的对象。它通常被用于标识事件的来源,可以将其视为事件发布者的引用。在事件处理程序中,可以通过将sender参数强制转换为发布者的类型来访问发布者的特定成员。
public class TemperatureSensor
{
public event EventHandler<EventArgs> TemperatureChanged;
private double temperature;
public double Temperature
{
get { return temperature; }
set
{
if (value != temperature)
{
temperature = value;
OnTemperatureChanged();
}
}
}
protected virtual void OnTemperatureChanged()
{
TemperatureChanged?.Invoke(this, EventArgs.Empty);
}
}
public class Display
{
private TemperatureSensor sensor;
public Display(TemperatureSensor sensor)
{
this.sensor = sensor;
this.sensor.TemperatureChanged += Sensor_TemperatureChanged;
}
private void Sensor_TemperatureChanged(object sender, EventArgs e)
{
TemperatureSensor temperatureSensor = (TemperatureSensor)sender;
Console.WriteLine($"Temperature changed: {temperatureSensor.Temperature}");
}
}
public class Program
{
public static void Main(string[] args)
{
TemperatureSensor sensor = new TemperatureSensor();
Display display = new Display(sensor);
sensor.Temperature = 25.0;
}
}
在上面的示例中,TemperatureSensor
类中定义了一个名为TemperatureChanged
的事件。当温度发生变化时,OnTemperatureChanged
方法会引发该事件,并传递this
作为sender
参数。
在Display
类中,我们订阅了TemperatureChanged
事件,当事件被触发时,Sensor_TemperatureChanged
方法会被调用,并进行相应的处理。通过将sender
参数强制转换为TemperatureSensor
类型,我们可以访问Temperature
属性并进行操作。
2.2 EventArgs e
EventArgs e参数表示事件的附加信息。然而,EventArgs是一个基础类,通常被用作泛型参数来指定更具体的事件参数类型。具体使用哪个事件参数取决于事件的需求。
public class PropertyChangedEventArgs : EventArgs
{
public string PropertyName { get; }
public PropertyChangedEventArgs(string propertyName)
{
PropertyName = propertyName;
}
}
public class Person
{
private string name;
public event EventHandler<PropertyChangedEventArgs> NameChanged;
public string Name
{
get { return name; }
set
{
if (value != name)
{
name = value;
OnNameChanged();
}
}
}
protected virtual void OnNameChanged()
{
NameChanged?.Invoke(this, new PropertyChangedEventArgs("Name"));
}
}
public class Logger
{
public Logger(Person person)
{
person.NameChanged += Person_NameChanged;
}
private void Person_NameChanged(object sender, PropertyChangedEventArgs e)
{
Console.WriteLine($"Name changed: {e.PropertyName}");
}
}
public class Program
{
public static void Main(string[] args)
{
Person person = new Person();
Logger logger = new Logger(person);
person.Name = "John Doe";
}
}
在上面的示例中,我们首先定义了一个名为PropertyChangedEventArgs
的自定义事件参数类,它包含一个PropertyName
属性作为附加信息。然后,Person
类中定义了一个NameChanged
事件,并在OnNameChanged
方法中引发该事件,并传递一个新的PropertyChangedEventArgs
实例作为e
参数。
在Logger
类中,我们订阅了NameChanged
事件,并在Person_NameChanged
方法中打印出PropertyName
属性的值,即"Name"。
3. 总结
事件是C#中实现发布-订阅模式的重要机制。通过使用object sender和EventArgs e参数,事件可以将重要的信息传递给订阅者,并允许其根据需要做出响应。在编写事件处理程序时,我们可以使用这些参数来访问事件的来源对象以及附加的事件数据。