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