许多实例的一个处理程序

时间:2011-06-11 17:14:08

标签: c# event-handling

我有一个班级的2个实例。

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;
        }
    }

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

正如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(/* ... */));
}

答案 1 :(得分:0)

你应该使用例外(正如Chaos提到的那样)。

if (value < 0)
{
  throw new ArgumentException("Width can not be less than zero!");
}

see MSDN