У нас есть код, аналогичный приведенному ниже, в одном из наших проектов. Может ли кто-нибудь объяснить (на простом английском), зачем здесь нужен фиксированный оператор?
class TestClass
{
int iMyVariable;
static void Main()
{
TestClass oTestClass = new TestClass();
unsafe
{
fixed (int* p = &oTestClasst.iMyVariable)
{
*p = 9;
}
}
}
}





Он понадобится вам везде, где вы выполняете арифметические операции с указателями, чтобы сборщик мусора не перемещал его на вас.
Я использовал термин «арифметика указателя» в более широком смысле, чтобы обозначать «операции, выполняемые над указателем».
фиксированное заявление «закрепит» переменную в памяти, чтобы сборщик мусора не перемещал ее при сборке. Если бы он действительно переместил переменную, указатель стал бы бесполезным, и когда вы его использовали, вы бы попытались получить доступ или изменить то, что вы не собирались делать.
Поскольку вы работаете в небезопасном режиме (указатель), фиксированная инструкция выделяет определенное пространство памяти для этой переменной. Если вы не поставили фиксированную инструкцию, сборщик мусора может переместить в памяти переменную куда угодно, когда захочет.
Надеюсь на эту помощь.
Он фиксирует указатель в памяти. Языки со сборкой мусора могут свободно перемещать объекты по памяти для повышения эффективности. Все это прозрачно для программиста, потому что они на самом деле не используют указатели в «нормальном» коде CLR. Однако, когда вам нужны указатели, вам нужно исправить их в памяти, если вы хотите с ними работать.
MSDN имеет очень похожий пример. Оператор fixed в основном блокирует сборку мусора. В .Net, если вы используете указатель на ячейку памяти, среда выполнения может перераспределить объект в «лучшее» место в любое время. Итак, если вы хотите получить доступ к памяти напрямую, вам нужно исправить это на месте.
Я не вижу, чтобы в вопросе выполнялась арифметика с указателями. возможно, вы сможете пояснить, что вы имеете в виду под словом «арифметика». нет ни + - *, ни /.