委托,为什么关键字事件与操作符'= & # 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);
}
}
}
该限制适用于声明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