委托,为什么关键字事件与操作符'= & # 39;

本文关键字:操作符 为什么 关键字 事件 委托 | 更新日期: 2023-09-27 18:11:45

我知道与委托变量相关的关键字'event'只允许您使用操作符+=和-=,而操作符=是禁止的。我试图验证这种行为,但是在mydelegate = p.stampaPropUmano;行,不仅Visual Studio没有向我发出错误信号,而且所有工作都很完美。stampaPropUmano和stampaPropAnimale分别是类Umano和Animale的两个方法。

你知道原因吗?请让我知道关键字"事件"是否给其他属性。在我的文档中,我发现了我之前所说的属性。关于

namespace csharpWPFevent
    { 
    public delegate void delegato(int index=7);
public partial class MainWindow : Window
    {
        public event delegato mydelegate;
        public MainWindow()
        {
            InitializeComponent();
            Persona p = new Persona();
            p.Costa = "Paulo";
            p.Cognome = "Sousa";
            Animale a = new Animale("Fufficus", "Cane spaziale");
            mydelegate = p.stampaPropUmano; // ??????? Why?
            mydelegate += a.stampaPropAnimale;
        }
        private void button_Click(object sender, RoutedEventArgs e)
        {
            mydelegate(1);   
        }
    }
}

委托,为什么关键字事件与操作符'= & # 39;

该限制适用于声明event的类的客户端,类本身可以使用=。如

public delegate void delegato(int index=7);
public class Foo
{
    public event delegato myEvent;
    public void Bar()
    {
        // no error
        myEvent = (int i) => {};
    }
}
void Main()
{
    var foo = new Foo();
    // The event 'Foo.myEvent' can only appear on the left hand side of += or -= (except when used from within the type 'Foo')
    foo.myEvent = (int i) => {};        
}

c#事件是一个多播委托。也就是说,一个委托有多个目标。

所有event关键字所做的是确保不拥有委托的类只能在字段上使用+=-=操作符。

通过使用=运算符,您将覆盖delegato的值,将其赋值给p.stampaPropUmano

好吧。让我们更明确一点:

委托:

   Action a = null;
   a = MyMethod;  // overwrites value of a with one method;
   a += MyMethod; // assigns method to a (not changing anything apart of it)
   a -= MyMethod; // removes method from a

Events:

类内部声明:

   public event Action MyEvent;

类的内部或任何其他方法:

   MyEvent = new Action(MyMethod);  // assign the event with some delegate;

在相同或任何其他类中:

   myClassInstance.MyEvent += new Action(MyOtherMethod); // subscribing for the event;
   myClassInstance.MyEvent -= new Action(MyOtherMethod); // unsubscribing for the event;      

因此,无论何时触发事件,它都会调用订阅它的委托上的方法(或方法),或者在创建该事件的类中显式设置。

你可能会问:为什么不能直接从其他类给事件赋值?

因为在这种情况下使用事件是不安全的。

让我们假设可以为来自其他类的事件分配一些值,并考虑以下场景:

Class A has event - > MyEvent;
Class B subscribes for event with += 
Class C subscribes for event with += 
Class D changes MyEvent value to `null`
Event is invoked in Class A, but it's set to null and exception is thrown