Возьмите адрес параметра ref

Мой код выглядит следующим образом

class MyClass
{
    static int iField = 42;
    static void Test(ref int arg)
    {
         unsafe
         {
            fixed(void* pField = &iField)
            fixed(void* pArg = &arg)
            {
                Console.WriteLine ("{0},{1}",(int)pArg,(int)pField);
                //output: 165451772,165451772
            }
         }
    }

    static void Main()
    {
        Test(ref iField);
    }
}

Я хотел бы знать, так ли надежен выбор адреса параметров ref, как показано выше в тесте.


person Need4Steed    schedule 29.07.2011    source источник
comment
Кстати, я также хотел бы знать, будет ли статическое поле типа значения структуры/класса сохранять свой адрес неизменным на протяжении всего срока его службы.   -  person Need4Steed    schedule 29.07.2011


Ответы (1)


Насколько я знаю, да, пока вы находитесь в блоке fixed, GC не будет перемещать arg. Оказавшись за пределами блока fixed, переменная открепляется и, таким образом, может быть перемещена GC.

Что касается static структуры/класса/поля, сохраняющего фиксированный адрес в памяти, ответ отрицательный. Они подлежат перемещению, как и любой другой объект. Нет гарантии само по себе, что в будущем не будет перемещений в памяти только потому, что она помечена как static.

Значение static связано со знанием и уверенностью, которые компилятор имеет во время компиляции определенного класса/структуры/поля, что у вас есть. Это не имеет ничего общего с ячейками памяти, их фиксированностью или нет и т. Д. По словам Эрика Липперта:

Статические методы называются «статическими», потому что во время компиляции всегда можно точно определить, какой метод будет вызываться. То есть метод может быть разрешен исключительно статическим анализом кода.

person InBetween    schedule 29.07.2011