这个C#构造在做什么
本文关键字:什么 这个 | 更新日期: 2023-09-27 18:20:42
我在另一篇帖子上看到了这件事,它让我很困惑…
public class MyClass : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
public string MyProperty
{
set
{
if (_myProperty != value)
{
_myProperty = value;
NotifyPropertyChanged("MyProperty");
}
}
}
}
MyClass myClass = new MyClass();
myClass.PropertyChanged += delegate(object sender, PropertyChangedEventArgs e)
{
actual = e.PropertyName;
};
老实说,我想知道最后几行是怎么做的,为什么用户会为一个事件分配一个代理?他们会不会给它分配一个方法(作为事件处理程序),甚至是一个匿名方法作为事件处理?
我认为活动是为了概括代表。。。。。?
您始终使用委托订阅事件(或取消订阅)。即使你这样做:
button.Click += HandleButtonClick;
这相当于
button.Click += new EventHandler(HandleButtonClick);
当你说:
他们会不会给它分配一个方法(作为事件处理程序),甚至是一个匿名方法作为事件处理?
这正是代码的最后几行所做的。这就是delegate (...) { ... }
。
我认为活动是为了概括代表。。。。。?
事件提供了观察器模式的实现,使用委托作为观察器。
此语法是在C#2.0中引入的他们在这里使用了一个匿名方法,而不必创建该类的实际实例方法。它通常被认为更干净。
在C#3及以上版本中,也可以使用Lambda表达式。
+=
向事件添加一个匿名委托。您可以使用C#2.0语法在另一个函数的主体中匿名创建这样的委托,而不是创建具有签名object sender, PropertyChangedEventArgs e
的命名方法。另一种方法是使用C#3.5+中更简洁的lambda语法:
myClass.PropertyChanged += (sender, e) { actual = e.PropertyName; };
他们没有为事件分配委托,而是使用匿名方法向该事件添加订阅者。
此外,顺便说一句,NotifyPropertyChanged方法应该改为:
protected void NotifyPropertyChanged(String info)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(info));
}
}
由于在委托的null检查和调用之间存在潜在的竞争条件。
从技术上讲,您是正确的;事件封装委托。但是,事件处理程序本身就是委托。
描述
此类实现INotifyPropertyChanged
接口
MSDN通知客户端属性值已更改。
INotifyPropertyChanged接口用于通知客户端(通常是绑定客户端)属性值已更改。
这用于例如Datagrid之类的控件。它向控件发出属性已更改的信号,控件应重新提交。
关于事件
您总是订阅活动。
MyClass myClass = new MyClass();
myClass.PropertyChanged += delegate(object sender, PropertyChangedEventArgs e)
{
actual = e.PropertyName;
};
正在做与相同的事情
MyClass myClass = new MyClass();
myClass.PropertyChanged += new PropertyChangedEventHandler(myClass_PropertyChanged);
void myClass_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
actual = e.PropertyName;
}
或
MyClass myClass = new MyClass();
myClass.PropertyChanged += myClass_PropertyChanged;
void myClass_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
actual = e.PropertyName;
}
更多信息
- INotifyPropertyChanged接口