这个C#构造在做什么?

时间:2012-01-19 14:44:55

标签: c#

我在另一篇文章中看到了这一点,让我感到困惑......

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;
};

我想知道最后几行是不是说实话,用户为什么要委托代表参加活动?他们不会为它分配一个方法(作为事件处理程序),甚至是作为事件处理程序的匿名方法吗?

我认为事件是为了封装代表.....?

6 个答案:

答案 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)

从技术上讲,你是对的;事件封装代表。但是,事件处理程序本身就是代理。