我知道与委托变量关联的关键字'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);
}
}
}
答案 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