例如,以下代码会在事件订阅者释放后,再次触发事件:
private void OnSomeEvent(object sender, EventArgs e)
{
if (_subscriber != null)
{
_subscriber.DoSomething();
}
}
应该修改为:
private void OnSomeEvent(object sender, EventArgs e)
{
var subscriber = _subscriber;
if (subscriber != null)
{
subscriber.DoSomething();
}
}
例如,以下代码会在引用已释放的对象时,抛出ObjectDisposedException异常:
public class MyClass : IDisposable
{
public event EventHandler MyEvent;
private bool _disposed = false;
public void Dispose()
{
_disposed = true;
}
protected virtual void OnMyEvent(EventArgs e)
{
if (_disposed)
{
throw new ObjectDisposedException("MyClass");
}
MyEvent?.Invoke(this, e);
}
}
应该修改为:
public class MyClass : IDisposable
{
public event EventHandler MyEvent;
private bool _disposed = false;
public void Dispose()
{
_disposed = true;
}
protected virtual void OnMyEvent(EventArgs e)
{
if (_disposed)
{
return;
}
MyEvent?.Invoke(this, e);
}
}
例如,以下代码会在未订阅事件处理程序时,手动调用事件处理程序,导致ObjectDisposed