事件参数是通过C#中的引用还是值传递的?

Xan*_*ham 14 .net c# events event-handling reference-type

一个相当简单的问题(我认为),但我似乎没有看到答案.我知道有些值是通过值传递的(比如int和long),而其他值是通过引用传递的(比如字符串),当你将它们传递给函数时.

在我的程序中,我使用后台工作程序,以便在我们在后台执行长时间的过程时GUI不会锁定.我需要将数据从另一个文件传递回UI线程,所以我一直在使用事件.现在我需要将一个字符串数组列表发送回GUI线程来处理,我担心它将如何处理.基本上,在工作线程中,我有一个循环,它将填充列表,通过事件处理程序将其发送回GUI,然后清除它,以便它可以在下一次循环中填充它并重新开始.

我担心当我这样做时,如果列表是通过引用传递的,那么在UI线程上,我认为它会在读取中间被清除,因为工作线程仍将在后台清除它.在这种情况下,传递将是更可取的,我可以找到强制它的方法(复制到某个持有者数组或添加互斥或类似的东西),但我认为知道事件参数是否通过传递是很好的一般的引用或值,或者它与方法是否相同,并且它会在通常传递参数时传递它们?

Jon*_*eet 21

我知道有些值是通过值传递的(比如int和long),而其他值是通过引用传递的(比如字符串),当你将它们传递给函数时.

不.默认情况下,所有内容都按值传递 - 但是当您使用引用类型时,"所有内容"都是引用.该引用按值传递.这是一样的按引用传递.有关详细信息,请参阅有关参数传递的文章.

事件参数完全相同 - 假设相应的委托不使用outref参数,任何引用都按值传递.

编辑:所以要解决你的问题:是的,如果你的事件参数是可变的并且你要在不同的线程上行动,你应该先创建一个副本......或者,传递现有的引用,然后创建一个新的(您的工作线程中的空列表.