我有以下代码,当它在运行时查看它时显示初始'myInt'和'myFloat'在方法调用返回之前不会更改它们的值。每次在被调用的方法中改变它们的值时它们的值是否应该改变,因为它们每次都被作为'ref'传递?
class Tester
{
public void Run()
{
int myInt = 42;
float myFloat = 9.685f;
Console.WriteLine("Before starting: \n value of myInt: {0} \n value of myFloat: {1}", myInt, myFloat);
// pass the variables by reference
Multiply( ref myInt, ref myFloat );
Console.WriteLine("After finishing: \n value of myInt: {0} \n value of myFloat: {1}", myInt, myFloat);
}
private static void Multiply (ref int theInt, ref float theFloat)
{
theInt = theInt * 2;
theFloat = theFloat *2;
Divide( ref theInt, ref theFloat);
}
private static void Divide (ref int theInt, ref float theFloat)
{
theInt = theInt / 3;
theFloat = theFloat / 3;
Add(ref theInt, ref theFloat);
}
public static void Add(ref int theInt, ref float theFloat)
{
theInt = theInt + theInt;
theFloat = theFloat + theFloat;
}
static void Main()
{
Tester t = new Tester();
t.Run();
}
}
答案 0 :(得分:4)
如果在(例如)Add
中放置一个断点,那么除非你重新评估它们,否则你的监视变量不会改变 - 这必须在正确的堆栈中完成。当断点被击中时,转到调用堆栈视图,双击“运行”方法(这不会改变您所在的位置,只是您正在查看的堆栈框架),您将看到值更新。
答案 1 :(得分:1)
根据Jon和Jamietre的评论,这是一个调试器异常,值立即改变。
答案 2 :(得分:1)
您对表达式myInt
和myFloat
而不是表达式theInt
和theFloat
放置了监视,因此您不再看到它们的值。 当前范围中不存在myInt
和myFloat
。
您可以备份调用堆栈以观察其值,或者监视您关注的所有四个表达式。