一个处理程序用于多个实例

本文关键字:用于 程序 实例 一个 处理 | 更新日期: 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