public class Person {
private string name;
public string Name {
get { return name; }
set {
if (name != value) {
name = value;
OnNameChanged();
}
}
}
public event EventHandler NameChanged;
protected virtual void OnNameChanged() {
NameChanged?.Invoke(this, EventArgs.Empty);
}
}
在这个示例中,我们声明了一个私有字段 _name
作为存储名称的后端字段,并将其封装在公共属性 Name
中。在 setter 方法中,我们首先检查新值是否与旧值相同。如果不同,我们才更新存储字段,并调用 OnNameChanged()
方法来引发 NameChanged
事件。
注意,OnNameChanged
方法是使用 protected
访问修饰符进行定义的。这允许在继承类中覆盖此方法,并添加进一步的处理逻辑。在此方法中,我们通过执行空检查来安全地调用 NameChanged
事件,以确保未向事件委托传递 null 引用。
现在,你可以订阅 NameChanged
事件,并在每次 Name
属性更改时收到通知:
var person = new Person();
person.NameChanged += (sender, e) => {
Console.WriteLine($"Name changed to: {((Person)sender).Name}");
};
person.Name = "Alice"; // "Name changed to: Alice" 将被输出到控制台
person.Name = "Bob"; // "Name changed to: Bob" 将被输出到控制台
在此例中,我们创建了一个新的 Person
对象,并订阅了其 NameChanged
事件。然后,我们两次设置该对象的 Name
属性,从而引发对应的事件并显示名称已更改的消息。
这段代码涉及以下知识点:
- 事件:
NameChanged
是一个事件,它是Person
类中声明的一个类型为EventHandler
的公共事件。通过这个事件,Person
类向其他对象(比如现在正在编写的代码)通知其名称属性已更改。 - 匿名函数:
=>
符号后面跟着一段匿名函数表达式,它被传递给NameChanged +=
的右侧。这个匿名函数接受两个参数sender
和e
,它们分别表示触发事件的对象和事件数据。匿名函数的主体内有一行代码,输出一个字符串,其中包含名称属性新的值,以及触发事件的对象的名称。 - 字符串插值(string interpolation):使用
$
符号将字符串格式化为带大括号{}
的占位符,表示需要插入变量或表达式的位置。大括号内的表达式是一个用圆括号括起来的成员访问表达式,它在运行时被求职,用于获取修改后的名称属性的值。
NameChanged += 的加号是什么意思?
+=
表示向事件添加一个处理程序(event handler)。在这种情况下,它将匿名函数赋值给 NameChanged
事件。当 NameChanged
事件被触发时,事件发出通知以便所有已注册的事件处理程序都能执行其逻辑操作。通过使用 +=
操作符,可以将多个事件处理程序添加到同一事件中,从而实现事件的多播 (Multicasting)。
public event EventHandler NameChanged; 这段代码是什么意思?
这段代码定义了一个 NameChanged
事件,它使用 EventHandler
委托来表示事件处理程序的方法。 EventHandler
委托是 .NET 框架中预定义的一种类型,用于表示不接受任何参数并返回空值的方法。文章来源:https://www.toymoban.com/news/detail-476386.html
此外,event
关键字声明了该字段为一个事件,该事件只能在类内部被触发和订阅。 这意味着其他代码无法直接触发或调用该事件。 若要触发该事件,必须通过调用它的公共方法来实现。 例如,在该类中可能有一个名为 OnNameChanged
的保护虚拟方法,该方法会立即引发 NameChanged
事件。 泛型版本的 EventHandler<TEventArgs>
委托也可用于代替 EventHandler
委托,以提供更强类型的事件参数。文章来源地址https://www.toymoban.com/news/detail-476386.html
到了这里,关于关于set变更通知涉及的一些知识点的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!