C# 如何在分配新处理程序时引发事件?

C# 如何在分配新处理程序时引发事件?,c#,events,.net-4.0,C#,Events,.net 4.0,我正在尝试复制现有.NET XNA类的事件提供的功能: 当事件分配给它时,可以立即引发,例如: myNetworkSession.GamerJoined += GamerJoinedEventHandler; void GamerJoinedEventHandler(object sender, GamerJoinedEventArgs e) { // If you put a beakpoint on the assignment line above and another her

我正在尝试复制现有.NET XNA类的事件提供的功能:

当事件分配给它时,可以立即引发,例如:

myNetworkSession.GamerJoined += GamerJoinedEventHandler;

void GamerJoinedEventHandler(object sender, GamerJoinedEventArgs e)
{
    // If you put a beakpoint on the assignment line above and another here
    // this handler is called during the assignment.
}

如果我正在编写自己的
NetworkSession
类和
GamerJoined
事件,如何实现这一点?

是的,您可以使用上下文关键字来实现

当您有电话线时:

public event EventHandler<GamerJoinedEventArgs> GamerJoined;

如果您在事件处理程序方法中使用了一个副作用,那么直接调用它就可以了,您不需要XNA来为您做这件事。很可能您必须对其进行重构,并将一些代码移动到私有方法中,因为构建有效的GamerJoinedEventArgs实例应该很困难。@HansPassant我正在编写该类的实现,因此为XNA one编写的用户代码将仅使用我的代码即可。然后,这就是代码气味。有些客户端代码想知道玩家何时加入网络,但你不知道这些代码是什么样子,这并不意味着玩家确实加入了网络。也许我关心的是兼容性,甚至微软的示例也依赖于这种行为。它所做的是为所有在客户端订阅事件之前加入的玩家发起事件,请参阅文档。非常好。我从来没用过
public event EventHandler<GamerJoinedEventArgs> GamerJoined
{
    add
    {
        this.gamerJoined += (EventHandler<GamerJoinedEventArgs>)Delegate.Combine(this.gamerJoined, value);
    }
    remove
    {
        this.gamerJoined -= (EventHandler<GamerJoinedEventArgs>)Delegate.Remove(this.gamerJoined, value);
    }
}
public event EventHandler<GamerJoinedEventArgs> GamerJoined
{
    add
    {
        this.gamerJoined += (EventHandler<GamerJoinedEventArgs>)Delegate.Combine(this.gamerJoined, value);
        value(this, new GamerJoinedEventArgs(myGamer));
    }
    remove
    {
        this.gamerJoined -= (EventHandler<GamerJoinedEventArgs>)Delegate.Remove(this.gamerJoined, value);
    }
}