Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么从EventArgs继承有用?_C#_.net_Asp.net - Fatal编程技术网

C# 为什么从EventArgs继承有用?

C# 为什么从EventArgs继承有用?,c#,.net,asp.net,C#,.net,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 {

我不明白为什么从
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; } } 
}
在上面的代码中,如何使用此继承


我还想了解如何从
default.aspx

调用此代码块。下面是一个如何使用代码的示例:

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;  
    }
}
公共类MyClass(){
public event EventHandler ClickedEvent=delegate{};//注册事件
已单击受保护的空某物(int x,int y){
ClickedEvent(这个,新的ClickedEventArgs(x,y));//调用订阅的事件
}
}
公共类另一个类(){
公共另一类(){
MyClass mClass=新的MyClass();
mClass.ClickedEvent+=新事件处理程序(mClass\u ClickedEvent);
}
受保护的无效mClass\u clickedEvent(对象发送者,ClickedEventArgs e){
//检索从MyClass实例传递的X参数
int x=e.x;
}
}

您是否在问,首先从
事件参数派生为什么有用?我不得不说,对于C#1,这没有多大意义,因为委托转换的工作方式——但对于C#2,这更合理。它允许事件处理程序向事件注册,即使它不关心事件参数的细节

例如:

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

...

textArea.KeyPress += LogEvent;
即使
Control.KeyPress
是一个类型为
KeyPressEventHandler
的事件,此操作仍然有效。C#和.NET不介意
LogEvent
的签名与
KeyPressEventHandler
的签名不完全匹配-它足够兼容


诚然,如果我们根本没有
EventArgs
(您可以使用
object
),但考虑到
EventArgs
类和模式,从
EventArgs

派生您自己的事件参数是有意义的。这里真正重要的是,您可以在以后轻松升级事件以获得更多细节,并且不会破坏现有的解耦侦听器。

对于ASP.NET场景,我找不到必要的示例。如果您想获得单击的确切位置,那么在Windows窗体/WPF中这是很常见的。在web应用程序中,这类事件通常通过JavaScript在客户端处理。我想可以创建一个自定义控件,在回发中从JavaScript传递这些信息。具有签名(object,object)的委托更容易由于代码中的输入错误而被错误调用。签名为(object,EventArgs)这样的输入错误更容易在编译时被发现。哦,EventArgs有where-TEventArgs:EventArgs,因此如果您想使用此泛型而不是声明自己的处理程序类型,则需要从EventArgs派生。Microsoft删除了此
where-TEventArgs:EventArgs
泛型约束post-.NET 4()。不再需要从EventArgs继承。