簡體   English   中英

這個C#構造在做什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM