2011-04-15 106 views
1

我学过参考类型参数传递只是参考的副本。如果将传入的参考点设置为被调用方法内的另一个对象,则原始参考不会更改。参考类型参数问题

我有一个测试方法来测试引用类型参数传递。使用有效的SystemSwEvent类型对象从该测试方法调用refTest(SystemSwEvent systemSwEvent)方法。在refTest()方法中,调用processEvScanDataAvailable(EvScanDataAvaialble systemSwEvent)方法。在processEvScanDataAvailable(EvScanDataAvaialble systemSwEvent)方法中,我将传入的参考参数设置为null。我预计refTest()中的参数不应该改变。但事实并非如此。它将被更改为空暂时。为什么? enter image description here

enter image description here

+0

我刚刚就此提出了一个连接问题,如果您想为其投票:https://connect.microsoft.com/VisualStudio/feedback/details/662071/debugger-showing-improper-information-in-mouse-悬停 – 2011-04-15 20:49:44

回答

2

为什么呢?

我怀疑这是一个调试器问题,并不代表CLR中实际发生的事情。

尝试使用不同的变量名称为你的论点,而这种行为会自行消失。

0

对象引用,默认情况下(如果你不refout限定它们)通过按值,因此该方法被接收的对象引用的副本 - 设置,复制到null不改变原始的对象引用,所以你声称看到的是不可能的,而且很可能你只是误解了你在调试器中看到的内容。

+0

引用类型总是按引用传递,无论引用还是引用。 – Tejs 2011-04-15 20:23:41

+0

@Tejs:但引用本身被value_分隔。 – 2011-04-15 20:24:31

+0

@Tejs:对象引用**本身**是通过值传递的,请注意我说的是引用而不是对象。 – BrokenGlass 2011-04-15 20:25:21

4

调试器在当前背景下识别名称并显示值。 这只是巧合,您将光标指向实际触发当前正在执行的方法(当前上下文)的位置。

另外请注意,您可以使用调用堆栈工具检查的主叫方法的参数。

0

调试器越来越困惑,因为你的参数和变量具有相同的名称。如果您更改参数的名称,你会发现,该调试器不再提供有关变量为传递到方法的信息,但只给出了可变方法的信息。

只需更改参数的名称,你将不再有这个问题。