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

老实说,我想知道最后几行是怎么做的,为什么用户会为一个事件分配一个代理?他们会不会给它分配一个方法(作为事件处理程序),甚至是一个匿名方法作为事件处理?

我认为活动是为了概括代表。。。。。?

这个C#构造在做什么

始终使用委托订阅事件(或取消订阅)。即使你这样做:

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接口