方法的优先顺序是什么?

3

假设我有两个方法。其中一个是由列表框中选定的索引更改触发的方法。第二个方法帮助清除所有文本框,将列表框索引设置为-1,并设置焦点。

问题:

方法2执行时,它将列表框的选择索引更改为-1,从而触发第一个方法的事件。 Method 2是否停止自己的执行并将进程转移到事件,然后在Method 1完成后返回其工作...还是Method 2完成其整个代码块,然后由于所选索引更改而转移到Method 1?


欢迎来到我们的编程社区!根据我们的作业常见问题解答,我们希望您“首先尽力自己解决问题”。因此,请先尝试解决问题,然后发布并请求社区对您的答案进行评审。这样您将会学到更多,并且获得更多的回复。 - rbrayb
这不是一项作业任务。我目前是一名学生,试图扩展我的知识,但我目前的技术水平无法理解我找到的搜索结果 :-( 这个回答提供了一个很好的实际答案。谢谢大家。 - sheldonhull
与其仅仅搜索,你应该进行一些实验。闲逛谷歌几乎不能算作是诚心尝试自己解决问题,不是吗? - bzlm
5个回答

8
第一种情况。
先不考虑线程,特别是因为它们与您的场景无关。您所说的是属性和方法,但在这一切背后,它们都只是函数。当一个函数调用另一个函数时,在您的程序中控制权转移到被调用的函数。当该函数运行完成时,控制权返回到调用它的地方。您的程序自动记住了需要返回到哪里,无论函数嵌套多深。*
当您的第二个函数设置索引时,实际上编译器将属性集操作转换为函数调用。 (属性最终只是函数的“语法糖”)。该函数调用了许多其他与该场景无关的函数,除了其中一个函数调用了“索引已更改”的事件处理程序。它看到您有与该事件关联的方法,并调用您的第一个方法。
您的第一个方法运行,并在完成后返回“调用索引更改事件处理程序”的函数。最终,那些不重要的函数全部运行完成(可能会在顺序中进行更多的函数调用),并且“设置索引属性”函数将控制权返回到您的第二个方法。
您可以通过在第一个方法中显示消息框,并在第二个方法中设置索引属性后显示另一个消息框来证明您的第一个建议是如何工作的。(使用不同的消息!)您应该看到第一个消息出现,并在您关闭消息框后,应该看到第二个消息出现,从而表明第二个方法在第一个方法运行时没有继续执行。
* 有一个限制,但是除非程序中存在错误,否则很少会被击中。当您拥有太多嵌套函数调用时,会发生堆栈溢出。

1

还有第三种选择可以探索:它们也可以同时运行!如果我正确理解了你的问题,方法2将由索引更改事件触发。在C# Windows Forms应用程序中,这个事件会在一个单独的执行线程中发生。

要探索的概念:线程。

希望这能给你在知识探索中提供一个起点。


1
假设没有多线程情况,事件将在方法执行结束之前触发。如果您想查看此内容,请使用.NET语言编写您建议的代码并检查生成的IL。您可以使用ILDASM或Reflector甚至创建自己的反射应用程序来完成这项工作。您必须足够了解IL的语法以查看分支,但只要您理解编程概念,就不是那么困难。
Rob已经将其标记为“语法糖”,我在某种程度上也同意。这实际上是编译器技巧,但我认为它属于“语法糖”标签,因为它通常被使用。

0

我假设你所使用的编程语言是C#,因此你拥有支持多线程的语言。如果你不想考虑线程问题(如果你考虑到用户体验,这是一个坏主意),你可以在一个线程中运行GUI并具有相同的行为,除非组件创建了自己的线程(尽管这有点奇怪)。如果你想实现事件的异步(并行)执行,你需要让事件触发在它自己的线程上。

回答你的问题:如果你没有使用多线程,事件触发的方法将被排队等待执行。这正是在一些程序中看到GUI响应缓慢时发生的情况。

希望以上内容能够帮助你理清思路,并欢迎你作为新手的加入 :)


他的问题被标记为C#。 - user47589
我已经相应地更改了我的答案,感谢您让我意识到这个明显的错误。 - Per Stilling
很棒的答案...基本上,方法完成后,一旦完成就会转移到下一个方法,从而“排队”触发事件,除非之前有故意调用。这真的很有帮助。线程听起来像是一个我将要学习的好概念!感谢欢迎。 - sheldonhull

0

我自己也是初学者,也许我可以帮忙。Method2会被触发,然后当选择改变时,Method1会做他的事情,然后Method2会继续。

如果你不想在那个时候触发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;
}

可能并不是最优的方法(或许有一些最佳实践...),但至少你有了一些信息来帮助你搜索。希望它有所帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接