我正在为我的一门课程编写一些测试,我需要测试是否正在引发一个事件。除了尝试并查看发生了什么之外,我编写了类似于以下极其简化的代码的代码。
public class MyEventClass
{
public event EventHandler MyEvent;
public void MethodThatRaisesMyEvent()
{
if (MyEvent != null)
MyEvent(this, new EventArgs());
}
}
[TestClass]
public class MyEventClassTest
{
[TestMethod]
public void EventRaised()
{
bool raised = false;
var subject = new MyEventClass();
subject.MyEvent += (s, e) => raised = true;
subject.MethodThatRaisesMyEvent();
Assert.IsTrue(raised);
}
}
当我开始尝试弄清楚它是如何工作的时候,我并不感到惊讶。具体来说,如果没有 lambda 表达式,我将如何编写它以便raised
可以更新局部变量?换句话说,编译器如何重构/翻译这个?
我走到这一步...
[TestClass]
public class MyEventClassTestRefactor
{
private bool raised;
[TestMethod]
public void EventRaised()
{
raised = false;
var subject = new MyEventClass();
subject.MyEvent += MyEventHandler;
subject.MethodThatRaisesMyEvent();
Assert.IsTrue(raised);
}
private void MyEventHandler(object sender, EventArgs e)
{
raised = true
}
}
但这会更改raised
为类范围的字段,而不是本地范围的变量。