Подтвердить что ты не робот

Фиксированный оператор в С#

В одном из наших проектов мы имеем аналогичный код. Может ли кто-нибудь объяснить (на простом английском), почему здесь нужен фиксированный оператор?

class TestClass
{
    int iMyVariable;
    static void Main()
    {
        TestClass oTestClass = new TestClass();
        unsafe
        {
            fixed (int* p = &oTestClasst.iMyVariable)
            {
                *p = 9;
            }
        }
    }
}
4b9b3361

Ответ 1

Он фиксирует указатель в памяти. У собранных мусором языков есть свобода перемещения объектов вокруг памяти для повышения эффективности. Все это прозрачно для программиста, потому что они действительно не используют указатели в "нормальном" CLR-коде. Однако, когда вам нужны указатели, вам необходимо исправить их в памяти, если вы хотите работать с ними.

Ответ 2

Фиксированный оператор будет "привязывать" переменную в памяти, чтобы сборщик мусора не перемещал его при сборе. Если он перемещает переменную, указатель станет бесполезным, и когда вы его используете, вы попытаетесь получить доступ или изменить то, что вы не намеревались.

Ответ 3

Вам это нужно в любом месте, где вы выполняете арифметику указателей, чтобы предотвратить сборщик мусора от него.

Ответ 4

Поскольку вы работаете в небезопасном режиме (указатель), фиксированная команда выделяет определенное пространство памяти для этой переменной. Если вы не поместили фиксированную инструкцию, сборщик мусора мог бы перемещать в памяти переменную где угодно, когда захочет.

Надеюсь на эту помощь.

Ответ 5

MSDN имеет очень похожий пример. Фиксированный оператор в основном блокирует сбор мусора. В .Net, если вы используете указатель на ячейку памяти, среда выполнения может перераспределить объект в "лучшее" местоположение в любое время. SO, если вы хотите получить доступ к памяти напрямую, вам необходимо исправить ее.