В чем разница между ссылкой на значение с помощью указателя и ключевого слова ref

У меня есть следующий код:

class Program
{
    private unsafe static void SquarePtrParam(int* input)
    {
        *input *= *input;
    }

    private static void SquareRefParam(ref int input)
    {
        input *= input;
    }

    private unsafe static void Main()
    {
        int value = 10;
        SquarePtrParam(&value);
        Console.WriteLine(value);

        int value2 = 10;
        SquareRefParam(ref value2);
        Console.WriteLine(value2);

        //output 100, 100
        Console.ReadKey();
    }
}

Какая разница между передачей указателя и ключевым словом ref в качестве параметра в методе?

Ответы

Ответ 1

Ключевое слово ref действует как указатель, но изолируется от изменений в фактическом местоположении объекта в памяти. Указатель - это определенное место в памяти. Для объектов, собранных для мусора, этот указатель может измениться, но если вы не используете оператор fixed, чтобы предотвратить его.

Вы должны изменить это:

SquarePtrParam(&value);

:

fixed (int* pValue = &value)
{
    SquarePtrParam(pValue);
}

чтобы указатель продолжал указывать на ожидаемые int данные.

http://msdn.microsoft.com/en-us/library/f58wzh21.aspx