![](/img/trans.png)
[英]What is this C# construct doing and why? MyClass<TMyClass> : MyClass where
[英]What is this C# construct doing?
我在另一篇文章中看到過這個令我困惑的事......
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 (...) { ... }
的含義。
我認為事件是為了封裝代表.....?
事件提供了觀察者模式的實現,使用委托作為觀察者。
該類實現了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;
}
+=
為事件添加匿名委托 。 不是使用簽名object sender, PropertyChangedEventArgs e
創建命名方法,而是可以使用C#2.0語法在另一個函數的主體中匿名創建此類委托。 另一種方法是使用C#3.5 +中更簡潔的lambda語法:
myClass.PropertyChanged += (sender, e) { actual = e.PropertyName; };
這種語法是在C#2.0中引入的。它們在這里使用匿名方法,而不是必須創建類的實際實例方法。 它通常被認為更清潔。
在C#3及更高版本中,也可以使用Lambda表達式。
他們沒有為一個事件分配一個委托,他們正在使用匿名方法向該事件添加一個訂閱者。
另外,另外,NotifyPropertyChanged方法應更改為:
protected void NotifyPropertyChanged(String info)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(info));
}
}
由於在null檢查和委托的調用之間存在潛在的競爭條件。
從技術上講,你是對的; 事件封裝代表。 但是,事件處理程序本身就是委托。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.