'ref' не работает так, как мне кажется - PullRequest
3 голосов
/ 05 июля 2011

У меня есть следующий код, который, глядя на него во время его работы, показывает, что начальные значения '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 ]

4 голосов
/ 05 июля 2011

РЕДАКТИРОВАТЬ: Хорошо, увидев описание в ваших комментариях ...

Если вы установите точку останова (скажем) Add, тогда ваши переменные наблюдения не изменятся, если вы не получите их для повторной оценки - что должно быть сделано в правильном стеке. Когда достигнута точка останова, перейдите в представление Call Stack, дважды щелкните по методу «Run» (который не меняет того, куда вы попали, только какой кадр стека вы просматриваете), и вы увидите значения обновляются.

1 голос
/ 05 июля 2011

Вы поместили Watch в выражения myInt и myFloat, а не в выражения theInt и theFloat, поэтому вы больше не видите их значения.myInt и myFloat не существуют в текущей области .

The Watch Window uses expressions not variables

Вы можете выполнить резервное копирование в стеке вызовов, чтобы посмотреть их значения, илипоместите часы на все четыре выражения , которые вас интересуют.

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

1 голос
/ 05 июля 2011

Это аномалия отладчика, значения меняются сразу, согласно комментариям Джона и Джамитра.

...