取ref形参的地址

本文关键字:地址 形参 ref | 更新日期: 2023-09-27 18:03:49

我的代码如下

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参数的地址是否像上面测试中显示的那样可靠

取ref形参的地址

据我所知,是的,当您在fixed块中时,GC将不会重新定位arg。一旦在fixed块之外,变量将被解除固定,从而受到GC的重定位。

关于static 结构/类/字段保持它的地址固定在内存中,答案是否定的。它们可以像其他物体一样重新定位。不能保证本身将来不会因为标记为static而在内存中重新定位。

static的重要性与编译器在编译时对某个类/结构/字段的了解和确定性有关。它与内存位置以及它们是否固定等无关。用Eric Lippert的话来说:

静态方法之所以被称为"静态",是因为在编译时总是可以准确地确定将调用哪个方法。也就是说,方法只能通过对代码的静态分析来解析。