这是一个例子......
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;
当处理程序尚未订阅它时会触发该事件。是否可以订阅初始化事件?
答案 0 :(得分:7)
正如评论所说,这是一个糟糕的代码味道。听起来你在这里做了一些非常不寻常的事情,你应该考虑尝试找到一种不同的方法来解决你的问题。
它闻起来很糟糕的原因之一是:如果调用代码知道将处理程序传递给构造函数,那么该代码已经知道正在调用构造函数。调用者只需调用处理程序本身与构造的实例!事件通常用于处理程序无法预测或控制的事情,例如用户单击按钮。
我不会将处理程序传递给构造函数,我是否在你的情况下。我会使用静态事件。
答案 1 :(得分:1)
您应该将处理程序传递给构造函数并将其附加到事件,例如:
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; });
}
}