代码之家  ›  专栏  ›  技术社区  ›  Justin Finkelstein

有人能用c#解释一下这个事件/方法传递语法吗?

  •  0
  • Justin Finkelstein  · 技术社区  · 7 年前

    这个问题可能被问了很多,我的问题的一个要点(也是我发布这个帖子的部分原因)是,我甚至不知道这种格式/语法叫什么,因此不知道要寻找什么。为了便于参考,我附上了这类代码的一个例子。在本例中,计时器使用的语法/功能我并不完全理解,但我在其他上下文中见过这种语法。我的目标是在一般情况下推断/理解/利用此功能(不一定使用计时器)。我理解代码是如何工作的,每隔2秒(大约)计时器就会激活“OnTimedEvent”,该方法会打印出有关事件的信息(如本文底部所示)。据我所知,我的计时器(“aTimer”)是一个对象,它有“autoreset”和“Enabled”等变量,这些变量在代码中被设置为“true”。

    这很难表达,但我不理解的是它的语法/工作方式。例如,我看到“aTimer.appeased+=OnTimedEvent”,我可以看到结果是“OnTimedEvent”在“appeased”事件发生时被调用。问题是我不了解它的后端,所以我不知道如何将其应用于我使用的其他代码。

    • “+=”的作用是什么?它是否附加了在事件发生时调用的方法?这是在与事件相同的线程中产生的,并且可以以这种方式调用多个方法(比如执行Appead+=ArbiraySecondMethod),还是覆盖了默认情况下连接到“Appead”的某个响应/方法?默认的反应是什么?
    • 在“OnTimedEvent”中,“source”和经过的事件实际上是如何传递给它的?
    • 我不知道“e.SignalTime”是如何通过编译器阶段的。“OnTimedEvent”怎么知道计时器对象存在?
    • 此外,如果将参数传递给“OnTimedEvent”,那么(Object x,Args y)是这种情况下使用的标准格式,我将查找什么来了解有关如何使用这些类型的“add-on”方法的更多信息(在一般上下文中)

    有问题的代码/语法:

    (很抱歉,格式很奇怪,但我想确保我将我想理解的特定部分加粗)

    {

    阿蒂默。已用+=OnTimedEvent;

    }

    私有静态空间 OnTimedEvent(对象源,ElapsedEventArgs e)

    {

    安慰WriteLine(“经过的事件在{0:HH:mm:ss.fff}引发”, e、 信号时间 );

    }

    完整程序供参考:

    class Program
    {
        private static System.Timers.Timer aTimer;
    
        public static void Main()
        {
            SetTimer();
    
            Console.WriteLine("\nPress the Enter key to exit the application...\n");
            Console.WriteLine("The application started at {0:HH:mm:ss.fff}", DateTime.Now);
            Console.ReadLine();
            aTimer.Stop();
            aTimer.Dispose();
    
            Console.WriteLine("Terminating the application...");
        }
    
        private static void SetTimer()
        {
            // Create a timer with a two second interval.
            aTimer = new System.Timers.Timer(2000);
            // Hook up the Elapsed event for the timer. 
            aTimer.Elapsed += OnTimedEvent;
            aTimer.AutoReset = true;
            aTimer.Enabled = true;
        }
    
        private static void OnTimedEvent(Object source, ElapsedEventArgs e)
        {
            Console.WriteLine("The Elapsed event was raised at {0:HH:mm:ss.fff}",
                              e.SignalTime);
        }
    }
    

    代码显示如下输出:

    //       Press the Enter key to exit the application...
    //
    //       The application started at 09:40:29.068
    //       The Elapsed event was raised at 09:40:31.084
    //       The Elapsed event was raised at 09:40:33.100
    //       The Elapsed event was raised at 09:40:35.100
    //       The Elapsed event was raised at 09:40:37.116
    //       The Elapsed event was raised at 09:40:39.116
    //       The Elapsed event was raised at 09:40:41.117
    //       ....(you get the point)
    //       Terminating the application...
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Community CDub    5 年前

    流量:

    create aTimer
    find Main()
    run SetTimer
    init aTimer to 2000 milliseconds
    set elapsed event to OnTimerEvent
    set aTimer to auto reset
    set aTimer enabled = true (Start the timer counting)
    console write: Press enter to quit.
    console write: App started at.
    Wait for console input Return key. -This "pauses" the app.
    stop aTimer
    dispose aTimer
    console write: Terminating
    

    “+=”做什么?

    向事件堆栈添加方法调用。

    它是否附加了在事件发生时调用的方法?

    是的,从技术上讲,将其添加到事件发生时要调用的方法列表中。

    这是在与事件相同的线程中生成的吗

    并且可以用这种方式调用多个方法(比如执行appeased+=ArbitrarySecondMethod)

    是的,你可以说:经过+=第一件事;经过的+=第二件事;等

    或者这是否覆盖了默认情况下连接到“已用”的某个响应/方法?

    不,是添加剂。

    默认的反应是什么?

    什么都没有,比如一个按钮没有被指定。

    在“OnTimedEvent”中,“source”和经过的事件实际上是如何传递给它的?

    与任何委托一样,触发它的对象将作为“发送方”与事件使用的任何eventargs类的新实例一起发送。当您使用+=分配方法时,它将进行检查,以确保方法签名与该模式匹配(对象, 某种事件参数 )

    我不知道“e.SignalTime”是如何通过编译阶段的。

    因为它是ElapEddEventArgs类的一部分。请注意前面的。它不是一个默认的EventArgs类,而是从中继承的,包含更多内容。当计时器触发事件时,会填充额外的内容。

    “OnTimedEvent”怎么知道计时器对象存在?

    其实不是。它只知道它希望得到两个对象 事情 还有一个ElapsedEventArgs 事情 .

    另外,通过将参数传递给“OnTimedEvent”,这(Object x,Args y)是这种情况下使用的标准格式吗

    是的,你会发现大部分,如果不是全部。Net事件处理程序期望这种签名。总是先是对象发送者,然后是某种EventArg对象。该事件参数对象将根据其订阅的事件而更改。MSDN库应该让您看到所需的内容。

    ,我将查找哪些内容以了解有关如何使用这些类型的“附加”方法的更多信息(在一般情况下)

    这些都是简单的事件方法,所以任何讨论都可以。Net事件将对此进行讨论。有关更具体的信息,请参见:

    MS Docs Events

    MS Docs Event Patters

    MS Docs Events Guide