Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.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#_Events_Constructor - Fatal编程技术网

C# 如何从类构造函数捕获事件触发

C# 如何从类构造函数捕获事件触发,c#,events,constructor,C#,Events,Constructor,这里有一个例子 public class CodeGenerator { public delegate void GeneratorCalculatorEventHandler(decimal Fond); public event GeneratorCalculatorEventHandler eventName; public CodeGenerator() { eventName?.Invoke(0); } } 我

这里有一个例子

public class CodeGenerator
{
     public delegate void GeneratorCalculatorEventHandler(decimal Fond);
     public event GeneratorCalculatorEventHandler eventName;

     public CodeGenerator()
     {
          eventName?.Invoke(0);
     }
}
我怎样才能赶上这个活动?如果我这样做:

CodeGenerator CodeGen = new CodeGenerator();
CodeGen.eventName     += CodeGen_eventName;

当处理程序尚未订阅该事件时,将触发该事件。是否可以在初始化时订阅事件?

您应该将处理程序传递给构造函数并将其附加到事件,例如:

public class CodeGenerator
{
    public delegate void GeneratorCalculatorEventHandler(decimal Fond);
    public event GeneratorCalculatorEventHandler eventName;

    public CodeGenerator(GeneratorCalculatorEventHandler listener)
    {
        eventName += listener;
        eventName?.Invoke(0);
    }
}

public class Test
{
    public Test()
    {
        CodeGenerator gen = new CodeGenerator((sen) => { return; });
    }
}

正如评论所说,这是一种糟糕的代码味道。听起来你在这里做了一些不寻常的事情,你应该考虑尝试找到一种不同的方式来解决你的问题。 它气味难闻的原因之一是:如果调用代码知道将处理程序传递给构造函数,那么该代码已经知道正在调用构造函数。调用方可以简单地使用构造的实例调用处理程序本身!事件通常用于处理程序无法预测或控制的情况,例如用户单击按钮


如果我是在你的情况下,我不会将处理程序传递给构造函数。我会使用静态事件。

在构造函数中传递它,或将处理程序传递给构造函数,并让构造函数钩住事件,这是此时附加事件的唯一方式。@ShadyOverflow我想知道您正在尝试实现什么您不应该需要这个。。。答案表明这是可行的,但这只是走错了一步。@HenkHolterman我当时在想,为什么要在类实例化时触发事件?好吧,这是可行的,老实说,我希望有不同的、更干净的方法,但只要ti有效,一切都好,谢谢先生。还有其他对这个问题发表评论的人。