Исправленный оператор в C#
-
03-07-2019 - |
Вопрос
У нас есть похожий на приведенный ниже код в одном из наших проектов.Кто-нибудь может объяснить (простым английским языком), зачем здесь нужен фиксированный оператор?
class TestClass
{
int iMyVariable;
static void Main()
{
TestClass oTestClass = new TestClass();
unsafe
{
fixed (int* p = &oTestClasst.iMyVariable)
{
*p = 9;
}
}
}
}
Решение
Он фиксирует указатель в памяти.Языки, собирающие мусор, имеют свободу перемещать объекты по памяти для повышения эффективности.Все это прозрачно для программиста, потому что на самом деле они не используют указатели в "обычном" CLR-коде.Однако, когда вам действительно требуются указатели, вам нужно зафиксировать это в памяти, если вы хотите с ними работать.
Другие советы
Тот Самый фиксированный оператор "закрепит" переменную в памяти, чтобы сборщик мусора не перемещал ее при сборе.Если бы он переместил переменную, указатель стал бы бесполезным, и когда вы использовали бы его, вы пытались бы получить доступ или изменить что-то, чего не собирались делать.
Он нужен вам везде, где вы выполняете арифметику указателей, чтобы сборщик мусора не перемещал его на вас.
Поскольку вы работаете в небезопасном режиме (указатель), фиксированная инструкция выделяет для этой переменной определенное пространство памяти.Если вы не поместили фиксированную инструкцию, сборщик мусора мог переместить в памяти переменную куда угодно, когда захочет.
Надеюсь, это поможет.
MSDN есть очень похожий пример.Оператор fixed в основном блокирует сборку мусора.В .Net, если вы используете указатель на ячейку памяти, среда выполнения может в любой момент перераспределить объект в "лучшее" место.ПОЭТОМУ, если вы хотите получить прямой доступ к памяти, вам нужно зафиксировать это на месте.