В чем разница между ссылкой на значение с помощью указателя и ключевым словом 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 17

1 ответ:

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

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

SquarePtrParam(&value);

К этому:

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

Чтобы убедиться, что указатель продолжает указывать на данные int, Вы ожидать.

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