获取ref参数的地址

时间:2011-07-29 08:24:46

标签: c# unsafe

我的代码如下

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);
    }
}

我想知道参考参数的地址是否与上面测试中显示的一样可靠。

1 个答案:

答案 0 :(得分:1)

据我所知,当您在fixed区块时, GC 将不会重新定位arg。一旦超出fixed块,变量就会被取消固定,因此可以通过 GC 进行重定位。

关于static struct / class / field 将其地址固定在内存中,答案是否定的。它们像任何其他对象一样被重新定位。没有保证本身,因为它被标记为static,所以内存中没有未来的重定位。

static的重要性与编译器在某个类/ struct / field 的编译时所具有的知识和确定性有关。它与内存位置无关,它们是否被修复等等。用Eric Lippert的话来说:

  

静态方法被称为“静态”,因为它总是可以在编译时确切地确定将调用哪种方法。也就是说,该方法只能通过代码的静态分析来解决。