クラスの 1 つのテストを書いていて、イベントが発生していることをテストする必要がありました。試してみて、何が起こったのかを見てから、次の非常に単純化されたコードに似たものをコーディングしました。
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);
}
}
それがどのように機能するかを理解し始めたときほど、私はそれが機能したときほど驚きませんでした. 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
は、ローカル スコープ変数ではなく、クラス スコープ フィールドに変更されます。