C#事件中的两个参数详解(objectsender,EventArgse)

1. 事件概述

在C#编程中,事件是一种使对象能够发布和接收消息的机制。事件通常用于实现观察者设计模式,其中一个对象(称为发布者)发布事件,而其他对象(称为订阅者)订阅该事件以接收通知。

2. 事件参数(object sender, EventArgs e)

在C#事件中,两个常见的参数是object senderEventArgs 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 senderEventArgs e参数,事件可以将重要的信息传递给订阅者,并允许其根据需要做出响应。在编写事件处理程序时,我们可以使用这些参数来访问事件的来源对象以及附加的事件数据。

后端开发标签