Raising events from structures

Posted on April 14, 2008

3


Problem:

Do warning bells go off in your head when you see code like the following?

struct SomeStruct
{
// some code here
public event EventHandler< EventArgs > SomeEvent;
// some more code here

public void DoSomething()
{
// some code here
if (SomeEvent != null)
SomeEvent(this, EventArgs.Empty);
}
}

Are there any problems you need to be aware of when declaring events inside structures?

Solution:

Well, code like the following wouldn’t work, even though it seems to be perfectly reasonable. foo_SomeEvent will actually never be called.

public void HookOntoEvent(SomeStruct foo)
{
foo.SomeEvent += new EventHandler(foo_SomeEvent);
}

void foo_SomeEvent(object sender, EventArgs e)
{
// code to handle event here
}

Why? Remember struct is a value-type. Consequently, foo in HookOntoEvent would be initialized with a copy of the actual SomeStruct object which was passed to it by the caller. So the method would only be hooking up foo_SomeEvent method to this copy of the object which will go out of scope as soon as the HookOntoEvent is done executing. As a result, foo_SomeEvent will never be called.

Be careful when mixing structures and events. I personally stay away from raising events from structures.

About these ads
Posted in: .NET, General