C# 手动调用事件处理程序
我有一个直接作为标准方法调用的事件处理程序方法。也就是说,它不仅在我的事件发生时被调用,而且还作为私有方法被调用C# 手动调用事件处理程序,c#,event-handling,C#,Event Handling,我有一个直接作为标准方法调用的事件处理程序方法。也就是说,它不仅在我的事件发生时被调用,而且还作为私有方法被调用 UtilStk.StkRoot.OnStkObjectAdded += new IAgStkObjectRootEvents_OnStkObjectAddedEventHandler(TallyScenarioObjects); private void TallyScenarioObjects(object sender) { ... } 直接调用此处理程序时
UtilStk.StkRoot.OnStkObjectAdded += new
IAgStkObjectRootEvents_OnStkObjectAddedEventHandler(TallyScenarioObjects);
private void TallyScenarioObjects(object sender)
{
...
}
直接调用此处理程序时是否适合传递null参数
TallyScenarioObjects(null);
只需将公共逻辑封装到可以从事件处理程序调用的另一个方法中:
UtilStk.StkRoot.OnStkObjectAdded += new IAgStkObjectRootEvents_OnStkObjectAddedEventHandler(TallyScenarioObjects);
private void TallyScenarioObjects(object sender)
{
DoStuff();
}
private void DoStuff() { ... }
private void AnotherMethod()
{
DoStuff();
}
UtilStk.StkRoot.OnStkObjectAdded += new IAgStkObjectRootEvents_OnStkObjectAddedEventHandler(TallyScenarioObjects);
private void TallyScenarioObjects(object sender)
{
DoTally(....);
}
private void DoTally(....)
{
}
也就是说,您的处理程序是一个方法,它没有什么特别之处,所以您可以随时虚构参数并直接调用它。不过我不会这样做。是的,这会起作用,但最好有第二个方法,可以直接调用或从事件处理程序调用:
UtilStk.StkRoot.OnStkObjectAdded += new IAgStkObjectRootEvents_OnStkObjectAddedEventHandler(TallyScenarioObjects);
private void TallyScenarioObjects(object sender)
{
DoStuff();
}
private void DoStuff() { ... }
private void AnotherMethod()
{
DoStuff();
}
UtilStk.StkRoot.OnStkObjectAdded += new IAgStkObjectRootEvents_OnStkObjectAddedEventHandler(TallyScenarioObjects);
private void TallyScenarioObjects(object sender)
{
DoTally(....);
}
private void DoTally(....)
{
}
如果没有其他问题,您就不会让其他开发人员感到困惑,因为他们不希望看到这样的事件处理程序。我同意其余部分。让您的事件调用一个方法。然后,您可以从任何地方调用该方法
UtilStk.StkRoot.OnStkObjectAdded += new IAgStkObjectRootEvents_OnStkObjectAddedEventHandler(TallyScenarioObjects);
private void TallyScenarioObjects(object sender)
{
MyMethod();
}
private void MyMethod()
{
//Code here.
}
只要您的事件处理程序处理空值,请参见-像这样直接调用事件处理程序是一种代码味道。