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