我在另一篇文章中看到了这一点,让我感到困惑......
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;
};
我想知道最后几行是不是说实话,用户为什么要委托代表参加活动?他们不会为它分配一个方法(作为事件处理程序),甚至是作为事件处理程序的匿名方法吗?
我认为事件是为了封装代表.....?
答案 0 :(得分:4)
您总是使用委托订阅某个事件(或取消订阅)。即使你这样做:
button.Click += HandleButtonClick;
相当于
button.Click += new EventHandler(HandleButtonClick);
当你说:
他们不会为它分配一个方法(作为事件处理程序),甚至是作为事件处理程序的匿名方法吗?
这正是最后几行代码所做的。那就是delegate (...) { ... }
。
我认为事件是为了封装代表.....?
事件提供了观察者模式的实现,使用委托作为观察者。
答案 1 :(得分:1)
此类实现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;
}
答案 2 :(得分:1)
+=
为活动添加了anonymous delegate。您可以使用C#2.0语法在另一个函数的主体中匿名创建此类委托,而不是使用签名object sender, PropertyChangedEventArgs e
创建命名方法。另一种方法是使用C#3.5 +中更简洁的lambda语法:
myClass.PropertyChanged += (sender, e) { actual = e.PropertyName; };
答案 3 :(得分:1)
此语法是在C#2.0中引入的 他们在这里使用匿名方法,而不是必须创建类的实际实例方法。它通常被认为更清洁。
在C#3及以上版本中,也可以使用Lambda表达式。
答案 4 :(得分:1)
他们没有为一个事件分配一个委托,他们正在使用匿名方法为该事件添加一个订阅者。
另外,另外,NotifyPropertyChanged方法应更改为:
protected void NotifyPropertyChanged(String info)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(info));
}
}
由于null检查和委托的调用之间存在潜在的竞争条件。
答案 5 :(得分:1)
从技术上讲,你是对的;事件封装代表。但是,事件处理程序本身就是代理。