在没有外部委托定义的情况下定义C#事件

时间:2011-03-19 15:30:48

标签: c# events delegates

出于好奇:是否可以在C#中定义事件而不定义委托类型?

类似于public event (delegate void(int)) EventName

3 个答案:

答案 0 :(得分:18)

内置了泛型委托类型Action<>Func<>,其中Action返回void。每个泛型类型参数是要传递给委托的参数的类型类型。 e.g。

public event Action<int> EventName;

此外,还有一个通用EventHandler<T>遵循传递Object sender的约定,并具有EventArgs类型。

答案 1 :(得分:4)

不,这是不可能的; ECMA-334,§17.7声明:

  

事件声明的类型应为委托类型(第11.2节)

和§11.2定义:

delegate-type:
    type-name

但是,从C#3开始,您可以使用各种预定义的泛型类型,例如Action<int>,这样您几乎不必定义自己的委托类型。

答案 2 :(得分:1)

不,AFAIK使用C#是不可能的。

我之所以这么认为,.NET事件基本上是一个添加了某些限制的委托。也就是说,event关键字未定义新的类型;从概念上讲,它更像是一个修饰符(想象诸如privatereadonly之类的东西),它在声明中用于修改已有的委托类型。正是这种修改增加了限制:

public EventHandler x;

这是一个普通的委托,可以传递(复制)并由任何人调用。

public event EventHandler x;

在幕后,这也是一个普通的委托,但它只能设置(=)并由包含x的类型调用;此外,代表不能传递给第三方;这些操作只能执行add+=)和remove-=)操作。