具有类继承的EventArgs但我不明白它有用吗?

Pen*_*uen 4 .net c# asp.net

我不明白扩展EventArgs是如何有用的.

public class ClickedEventArgs : EventArgs {
  int x;
  int y;
  public ClickedEventArgs (int x, int y) { 
   this.x = x; 
   this.y = y; 
  }
  public int X { get { return x; } } 
  public int Y { get { return y; } } 
}
Run Code Online (Sandbox Code Playgroud)

代码在上面.我怎样才能使用这种继承呢?我想学习如何从default.aspx调用此代码博客

Jon*_*eet 12

你是否在问为什么从一开始就派生出来是有用的EventArgs?我不得不说,使用C#1它没有多大意义,因为委托转换的工作方式 - 但从C#2开始,它更明智.它允许事件处理程序向事件注册,即使它不关心事件参数的细节.

例如:

void LogEvent(object sender, EventArgs e)
{
    Console.WriteLine("Event sent from " + sender);
}

...

textArea.KeyPress += LogEvent;
Run Code Online (Sandbox Code Playgroud)

即使Control.KeyPress是类型的事件,这仍然有效KeyPressEventHandler.C#和.NET不介意的签名LogEvent准确的签名匹配KeyPressEventHandler-这是不够的兼容.

不可否认,如果我们根本没有EventArgs(你可以使用object),这仍然是可行的,但考虑到EventArgs类和模式,从中派生自己的事件参数是有意义的EventArgs.

  • 与简单地使用对象相比,EventArgs有一个非常温和的优势.由于代码中的拼写错误,具有签名(对象,对象)的委托更容易被错误地调用.使用(object,EventArgs)的签名,这样的拼写错误更有可能在编译时被发现. (3认同)

Mas*_*ash 5

这里真正重要的是,您可以稍后轻松升级您的事件以获得更多详细信息,并且不会破坏现有的解耦侦听器。


And*_*ech 1

以下是如何使用代码的示例:

public class MyClass () {        
    public event EventHandler<ClickedEventArgs> ClickedEvent = delegate {};  //Register the event

    protected void SomethingWasClicked(int x, int y) {    
        ClickedEvent(this, new ClickedEventArgs(x,y));   //Invoke the event that is subscribed to
    }

}

public class AnotherClass () {

    public AnotherClass () {
        MyClass mClass = new MyClass();
        mClass.ClickedEvent += new EventHandler(mClass_clickedEvent);
    }

    protected void mClass_clickedEvent(object sender, ClickedEventArgs e) {
        //Retrieve the X parameter that was passed from the MyClass instance
        int x = e.X;  
    }
}
Run Code Online (Sandbox Code Playgroud)