Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 手动调用事件处理程序_C#_Event Handling - Fatal编程技术网

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.
}

只要您的事件处理程序处理空值,请参见-像这样直接调用事件处理程序是一种代码味道。