【问题标题】:Order of Precedence with methods?方法的优先顺序?
【发布时间】:2009-02-20 01:06:25
【问题描述】:

假设我有 2 种方法。一种是由列表框中所选索引更改触发的方法。第二种方法有助于清除所有文本框、将列表框索引设置为 -1 并设置焦点。

问题:

方法二执行,在代码期间它改变列表框的选定索引为-1,从而触发第一个方法的事件触发器。方法 2 是否暂停它自己的执行并将进程转移到事件,然后在方法 1 完成后返回到它的工作... /p>

【问题讨论】:

  • 欢迎 - 根据家庭作业的常见问题解答 - “首先真诚地尝试自己解决问题。”因此,请尝试一下,然后发布要求社区批评您的答案。你会学到更多,你会得到更多的回复。
  • 这不是家庭作业。我目前是一名试图扩展知识的学生,此时我出现的搜索超出了我的技术知识:-( 这提供了一个很好的可靠答案。谢谢大家。
  • 您应该一直在尝试,而不仅仅是搜索。闲置的谷歌搜索几乎不能算作自己解决问题的善意尝试,不是吗?

标签: c# listbox operator-precedence method-call


【解决方案1】:

第一种情况。

让我们暂时搁置线程,特别是因为它们不涉及您的场景。

您在谈论属性和方法,但在这一切之下,它们都只是函数。当一个函数调用另一个函数时,程序中的控制权转移到被调用函数。当该函数完成运行时,控件返回到它被调用的位置。无论函数调用更多函数的深度如何,您的程序都会自动记住它需要返回的位置。*

当您的第二个函数设置索引时,真正发生的是编译器将属性设置操作转换为函数调用。 (属性最终只是函数的“语法糖”。)该函数调用了一堆对场景不重要的其他函数,除了其中一个是调用“索引更改”事件处理程序的函数。它看到您有一个与该事件关联的方法,并调用您的第一个方法。

您的第一个方法运行,当它完成时,它返回到“调用索引更改事件处理程序”函数。最终,该函数和所有其他不重要的函数完成运行(可能在依次进行更多函数调用之后),并且“设置索引属性”函数将控制权返回给您的第二个方法。

您可以向自己证明您的第一个建议就是它的工作原理。在您的第一种方法中显示一个消息框,并在您设置 index 属性的第二种方法中之后显示另一个消息框。 (使用不同的消息!)您应该会看到第一条消息出现,在您关闭消息框后,您应该会看到第二条消息出现,从而表明第二个方法在第一个方法运行时没有继续执行。

*一个限制,但除非你的程序有错误,否则很少会遇到限制。当嵌套函数调用过多时,会发生堆栈溢出

【讨论】:

    【解决方案2】:

    您可以探索第三种选择:它们也可以同时运行!如果我正确理解您的问题,方法 2 将由索引更改事件触发。在 C# Windows 窗体应用程序中,此其他事件将在单独的执行线程中发生。

    探索的概念:线程。

    我希望这能为您探索知识提供一个起点。

    【讨论】:

      【解决方案3】:

      假设没有多线程情况,该事件将在方法执行结束之前触发。如果您想看到这一点,请使用 .NET 语言对您建议的内容进行编码并检查生成的 Il。您可以使用 ILDASM 或 Reflector 完成此操作,甚至可以创建自己的 relfletion 应用程序。你确实必须足够了解 IL 的语法才能看到分支,但并不难,只要你了解编程概念即可。

      Rob 已将其标记为“语法糖”,我对此表示同意。这确实是一个编译器技巧,但我想它属于常用的“语法糖”标签。

      【讨论】:

        【解决方案4】:

        我假设有问题的语言是 c#,因此您拥有一种支持多线程的语言。如果您不想担心线程(如果您考虑用户体验,这将是一个坏主意),您可以在一个线程中运行您的 GUI 并具有相同的行为,除非组件创建自己的线程(这会有点虽然很奇怪)。如果你想实现事件的异步(并行)执行,你需要让事件在它自己的线程中触发。

        回答您的问题:如果您不使用多个线程,则事件触发的方法将排队。当您在某些程序中看到 GUI 响应缓慢时,就会发生这种情况。

        希望它能解决问题并欢迎另一个新人:)

        【讨论】:

        • 他的问题被标记为 C#。
        • 我相应地更改了答案,感谢您让我意识到我的这个明显错误。
        • 很好的答案......所以基本上该方法完成,然后 ONCE 完成它转移到下一个方法,从而“排队”触发的事件,除非它是故意提前调用的。这真的很有帮助。线程听起来是个不错的概念,我会学习的!感谢您的欢迎
        【解决方案5】:

        我自己是初学者,也许我可以帮忙。方法2将触发,然后在选择变化时,Method1会做他的东西,然后方法将继续。

        如果您当时不希望 Method1 触发,您可能想要执行以下操作: (真的是伪代码)

        Method2(object sender, System.EventArgs e)
        {
          //Unsubscribe Method1 from ListboxEvent
          Listbox.OnSelectionChange -= Method1;
        
          ... Stuff Method2 actually does ...
        
          Manualy call Method1 if you want it to fire
        
          //Subscribe Method1 from ListboxEvent
          Listbox.OnSelectionChange += Method1;
        }
        

        它可能不是最佳的(可能是一些最佳实践......),但由于缺乏更好的解释,至少您有一些信息可以帮助您搜索。希望对您有所帮助!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多