'ref'不像我认为的那样工作

时间:2011-07-05 19:33:21

标签: c# .net pass-by-reference value-type

我有以下代码,当它在运行时查看它时显示初始'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();
     }
}

3 个答案:

答案 0 :(得分:4)

编辑:好的,看过评论中的说明......

如果在(例如)Add中放置一个断点,那么除非你重新评估它们,否则你的监视变量不会改变 - 这必须在正确的堆栈中完成。当断点被击中时,转到调用堆栈视图,双击“运行”方法(这不会改变您所在的位置,只是您正在查看的堆栈框架),您将看到值更新。

答案 1 :(得分:1)

根据Jon和Jamietre的评论,这是一个调试器异常,值立即改变。

答案 2 :(得分:1)

您对表达式myIntmyFloat而不是表达式theInttheFloat放置了监视,因此您不再看到它们的值。 当前范围中不存在myIntmyFloat

The Watch Window uses expressions not variables

您可以备份调用堆栈以观察其值,或者监视您关注的所有四个表达式

Select the original method in your call stack to view their values