有趣的问题。
WithEvents
自动化属性创建处理程序并将其附加到Elapsed
委托,所以这个不是NULL
- 因此没有例外
但是,当WithEvents
isNo
和Timer.Start()
被调用时,正如您正确地说的那样,即使(理论上)Elapsed
delegate 为空,也不会出现异常。
对此的简单解释是,无论WithEvents
财产如何,NAV 都会附加空委托。为了支持这一点,如果你把代码放在Timer::Elapsed()
触发器中,然后起飞WithEvents
,然后把它带回来 - 代码仍然存在(即触发器仍然以不变的形式存在),这使我倾向于得出它总是存在的结论(即空委托)。
但当然是资产净值,所以不可能那么简单。
我从上面的 MSDN 示例创建了一个测试代码单元,但对自动化做了一些小的改动:
/// <summary>
/// Whenever the internal timer elapses, an event must be fired
/// </summary>
private void mTimer_Elapsed(object sender, ElapsedEventArgs e)
{
OnElapsed(EventArgs.Empty);
throw null;
}
理论上,这应该在被调用NULL
时抛出mTimer_Elapsed
- 但是在 NAV 中不会出现任何问题。我更进一步并改变了这一点:
///<summary>
/// Invoke the Changed event; called whenever the internal timer elapses
/// </summary>
protected virtual void OnElapsed(EventArgs e)
{
throw new InvalidCastException("test");
//Elapsed();
}
同样,资产净值没有任何变化。
COM Timer
请注意,如果从 .NET 项目中使用,则这两个更改的行为都符合预期。这让我觉得,NAV Interop 必须从自动化中捕获异常并在内部处理它们。
然而,我会在Mibuso中提出这个问题——那里的人可能会更清楚。