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