Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.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# 将普通订户方法添加到事件和匿名事件处理程序之间有什么区别?_C#_Events_Delegates - Fatal编程技术网

C# 将普通订户方法添加到事件和匿名事件处理程序之间有什么区别?

C# 将普通订户方法添加到事件和匿名事件处理程序之间有什么区别?,c#,events,delegates,C#,Events,Delegates,我很难理解为什么可以将一个“普通”方法作为订阅者附加到发布者事件,以及一个委托 例如 public class Caller { public string Name { get; set; } public event EventHandler<RuedaEventArgs> MakeRuedaCall; public virtual void OnMakeRuedaCall(RuedaEventArgs args) { if (MakeR

我很难理解为什么可以将一个“普通”方法作为订阅者附加到发布者事件,以及一个委托

例如

public class Caller
{
    public string Name { get; set; }
    public event EventHandler<RuedaEventArgs> MakeRuedaCall;

    public virtual void OnMakeRuedaCall(RuedaEventArgs args) {
        if (MakeRuedaCall != null) {
            MakeRuedaCall(this, args);
        }
    }
}
这是一个类,我在该类中添加了一个方法作为构造函数中事件的订阅方

假设我还有别的地方

Caller matt = new Caller();

EventHandler<RuedaEventArgs> anonyMouseFunc = (sender, eventArgs) =>
{
    switch (eventArgs.CallName) {
        case "Patin":
            Console.WriteLine("Adding a new subscriber for Patin");
            break;
        case "Vacilala":
            Console.WriteLine("Adding a new subscriber for Vacilala");
            break;
    }
};
matt.MakeRuedaCall += anonyMouseFunc;
Caller matt=new Caller();
EventHandler anonyMouseFunc=(发送方,eventArgs)=>
{
开关(eventArgs.CallName){
案例“帕廷”:
Console.WriteLine(“为Patin添加新订户”);
打破
“瓦西里拉”案:
Console.WriteLine(“为Vacilala添加新订户”);
打破
}
};
matt.Makerudacall+=anonyMouseFunc;
抱歉,如果这似乎是一个愚蠢的问题,那么为什么您可以订阅事件的“普通”方法(假设它与委托符号匹配),以及作为事件委托的匿名方法

i、 e.
public EventHandler如何生成ruedacall处理这两个选项

非常感谢,

抱歉,如果这似乎是一个愚蠢的问题,那么为什么您可以订阅事件的“普通”方法(假设它与委托符号匹配),以及作为事件委托的匿名方法

在这两种情况下,您都在订阅代理。在这种情况下:

caller.MakeRuedaCall += MakeMovement;
。。。您正在使用方法组转换将
MakeMovement
(规范术语中的方法组)转换为委托实例。该代码(几乎完全)等同于:

caller.MakeRuedaCall += new EventHandler<RuedaEventArgs>(MakeMovement);
EventHandler<RuedaEventArgs> handler = MakeMovement;
caller.MakeRuedaCall += handler;
caller.makerudacall+=新事件处理程序(MakeMovement);
或者换一种说法,它相当于:

caller.MakeRuedaCall += new EventHandler<RuedaEventArgs>(MakeMovement);
EventHandler<RuedaEventArgs> handler = MakeMovement;
caller.MakeRuedaCall += handler;
EventHandler=MakeMovement;
caller.makerudacall+=处理程序;
当然,这种从常规方法创建委托的能力不仅仅用于事件处理,您还可以将其用于LINQ和使用委托的任何其他地方

抱歉,如果这似乎是一个愚蠢的问题,那么为什么您可以订阅事件的“普通”方法(假设它与委托符号匹配),以及作为事件委托的匿名方法

在这两种情况下,您都在订阅代理。在这种情况下:

caller.MakeRuedaCall += MakeMovement;
。。。您正在使用方法组转换将
MakeMovement
(规范术语中的方法组)转换为委托实例。该代码(几乎完全)等同于:

caller.MakeRuedaCall += new EventHandler<RuedaEventArgs>(MakeMovement);
EventHandler<RuedaEventArgs> handler = MakeMovement;
caller.MakeRuedaCall += handler;
caller.makerudacall+=新事件处理程序(MakeMovement);
或者换一种说法,它相当于:

caller.MakeRuedaCall += new EventHandler<RuedaEventArgs>(MakeMovement);
EventHandler<RuedaEventArgs> handler = MakeMovement;
caller.MakeRuedaCall += handler;
EventHandler=MakeMovement;
caller.makerudacall+=处理程序;

当然,这种从常规方法创建委托的功能不仅仅用于事件处理,您还可以将其用于LINQ和使用委托的任何其他地方。

事件
不处理任何内容。编译器负责创建一个方法,然后将其订阅给
事件的委托
,因此当您调用
事件
时,该方法将被执行。为什么您认为添加一个有名称的事件处理程序与添加一个没有名称的事件处理程序会有所不同?当事件触发时,方法名称的存在或缺少将如何影响它的执行能力?
事件
不处理任何内容。编译器负责创建一个方法,然后将其订阅给
事件的委托
,因此当您调用
事件
时,该方法将被执行。为什么您认为添加一个有名称的事件处理程序与添加一个没有名称的事件处理程序会有所不同?当事件触发时,方法名称的存在或缺少将如何影响其执行的能力?但是您没有告诉任何关于匿名方法订阅的信息,这(主要)是OP要求的。@Evk:OP似乎理解,在匿名方法的情况下,事件是通过委托订阅的,这是完全正确的-没有什么可以解释的。他们似乎对使用方法组的订阅是如何工作的感到困惑,所以这就是我解释的。感谢您澄清这一点。我在学习过程中没有遇到方法组,但现在有了意义。但是你没有告诉我关于匿名方法订阅的任何事情,这(主要)是OP要求的。@Evk:OP似乎理解,在匿名方法的情况下,事件是由委托订阅的,这是完全正确的-没有什么可以解释的。他们似乎对使用方法组的订阅是如何工作的感到困惑,所以这就是我解释的。感谢您澄清这一点。在我的学习过程中,我没有遇到过方法小组,但现在它有了意义。