委托,为什么关键词事件与运算符'='一起使用?

时间:2015-09-08 10:05:28

标签: c# delegates

我知道与委托变量关联的关键字'event'允许您只使用运算符+ =和 - =,并且禁止运算符=。我试图验证这种行为,但是在mydelegate = p.stampaPropUmano;行,不仅Visual Studio不会给我一个错误,而且一切都很完美。 stampaPropUmano和stampaPropAnimale分别是Umano和Animale类的两种方法。

你知道原因吗?如果关键字“event”给出其他属性,请告诉我。在我的文档中,我发现了我之前说过的属性。此致

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

3 个答案:

答案 0 :(得分:4)

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

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) => {};        
}

答案 1 :(得分:3)

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

所有event关键字都确保不拥有该委托的类只能在该字段上使用+=-=运算符。

使用=运算符,您将覆盖delegato的值,并将其分配给p.stampaPropUmano

答案 2 :(得分:1)

好。让我们再澄清一下:

代表:

   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

活动:

在类声明中:

   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