关于set变更通知涉及的一些知识点

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 属性,从而引发对应的事件并显示名称已更改的消息。

这段代码涉及以下知识点:

  1. 事件:NameChanged 是一个事件,它是 Person 类中声明的一个类型为 EventHandler 的公共事件。通过这个事件,Person 类向其他对象(比如现在正在编写的代码)通知其名称属性已更改。
  2. 匿名函数:=> 符号后面跟着一段匿名函数表达式,它被传递给 NameChanged += 的右侧。这个匿名函数接受两个参数 sender 和 e,它们分别表示触发事件的对象和事件数据。匿名函数的主体内有一行代码,输出一个字符串,其中包含名称属性新的值,以及触发事件的对象的名称。
  3. 字符串插值(string interpolation):使用 $ 符号将字符串格式化为带大括号 {} 的占位符,表示需要插入变量或表达式的位置。大括号内的表达式是一个用圆括号括起来的成员访问表达式,它在运行时被求职,用于获取修改后的名称属性的值。

NameChanged += 的加号是什么意思?

+= 表示向事件添加一个处理程序(event handler)。在这种情况下,它将匿名函数赋值给 NameChanged 事件。当 NameChanged 事件被触发时,事件发出通知以便所有已注册的事件处理程序都能执行其逻辑操作。通过使用 += 操作符,可以将多个事件处理程序添加到同一事件中,从而实现事件的多播 (Multicasting)。

public event EventHandler NameChanged; 这段代码是什么意思?

这段代码定义了一个 NameChanged 事件,它使用 EventHandler 委托来表示事件处理程序的方法。 EventHandler 委托是 .NET 框架中预定义的一种类型,用于表示不接受任何参数并返回空值的方法。

此外,event 关键字声明了该字段为一个事件,该事件只能在类内部被触发和订阅。 这意味着其他代码无法直接触发或调用该事件。 若要触发该事件,必须通过调用它的公共方法来实现。 例如,在该类中可能有一个名为 OnNameChanged 的保护虚拟方法,该方法会立即引发 NameChanged 事件。 泛型版本的 EventHandler<TEventArgs> 委托也可用于代替 EventHandler 委托,以提供更强类型的事件参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

董厂长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值