Фиксированный оператор в С#
В одном из наших проектов мы имеем аналогичный код. Может ли кто-нибудь объяснить (на простом английском), почему здесь нужен фиксированный оператор?
class TestClass
{
int iMyVariable;
static void Main()
{
TestClass oTestClass = new TestClass();
unsafe
{
fixed (int* p = &oTestClasst.iMyVariable)
{
*p = 9;
}
}
}
}
Ответы
Ответ 1
Он фиксирует указатель в памяти. У собранных мусором языков есть свобода перемещения объектов вокруг памяти для повышения эффективности. Все это прозрачно для программиста, потому что они действительно не используют указатели в "нормальном" CLR-коде. Однако, когда вам нужны указатели, вам необходимо исправить их в памяти, если вы хотите работать с ними.
Ответ 2
Фиксированный оператор будет "привязывать" переменную в памяти, чтобы сборщик мусора не перемещал его при сборе. Если он перемещает переменную, указатель станет бесполезным, и когда вы его используете, вы попытаетесь получить доступ или изменить то, что вы не намеревались.
Ответ 3
Вам это нужно в любом месте, где вы выполняете арифметику указателей, чтобы предотвратить сборщик мусора от него.
Ответ 4
Поскольку вы работаете в небезопасном режиме (указатель), фиксированная команда выделяет определенное пространство памяти для этой переменной. Если вы не поместили фиксированную инструкцию, сборщик мусора мог бы перемещать в памяти переменную где угодно, когда захочет.
Надеюсь на эту помощь.
Ответ 5
MSDN имеет очень похожий пример. Фиксированный оператор в основном блокирует сбор мусора. В .Net, если вы используете указатель на ячейку памяти, среда выполнения может перераспределить объект в "лучшее" местоположение в любое время. SO, если вы хотите получить доступ к памяти напрямую, вам необходимо исправить ее.