一个处理程序用于多个实例
本文关键字:用于 程序 实例 一个 处理 | 更新日期: 2023-09-27 17:59:07
我有来自一个类的两个实例。
Rectangle first = new Rectangle();
OnErrorHandler handler = new OnErrorHandler(Rectangle_OnError);
first.OnError += handler;
second.OnError += handler;
first.Width = 10;
first.Height = -5;
second.Width = -4;
second.Height = 2;
first.OnError -= handler;
first.Width = -1;
Rectangle second = new Rectangle();
我想知道是哪个实例创建了事件?
namespace EventSample
{
public delegate void OnErrorHandler(string message);
}
public class Rectangle
{
public event OnErrorHandler OnError;
private int _Width;
private int _Height;
public int Width
{
get
{
return _Width;
}
set
{
if (value < 0)
{
if (OnError != null)
OnError("Width can not be less than zero!");
return;
}
_Width = value;
}
}
谢谢你的帮助。
正如ChaosPandion上面所说,您应该使用异常来通知错误条件。
假设您仍然希望使用事件,那么应该在C#中使用适当的事件处理程序约定。这涉及到使用预定义的EventHandler<TEventArgs>
委托,而不是创建自己的委托。签名是这样的:
public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e);
在这种情况下,重要的部分是sender
,按照惯例,它是引发事件的实例。引发事件的典型方式如下:
EventHandler<MyEventArgs> myEvent = this.MyEvent;
if (myEvent != null)
{
// pass 'this' as sender to tell who is raising the event
myEvent(this, new MyEventArgs(/* ... */));
}
您应该为此使用异常(正如Chaos所提到的)。
if (value < 0)
{
throw new ArgumentException("Width can not be less than zero!");
}
请参阅MSDN