Взять адрес параметра ref - PullRequest
4 голосов
/ 29 июля 2011

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

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, как показано выше в тесте.

1 Ответ

1 голос
/ 29 июля 2011

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

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

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

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

...