我的代码如下
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);
}
}
我想知道参考参数的地址是否与上面测试中显示的一样可靠。
答案 0 :(得分:1)
据我所知,当您在fixed
区块时, GC 将不会重新定位arg
。一旦超出fixed
块,变量就会被取消固定,因此可以通过 GC 进行重定位。
关于static
struct / class / field 将其地址固定在内存中,答案是否定的。它们像任何其他对象一样被重新定位。没有保证本身,因为它被标记为static
,所以内存中没有未来的重定位。
static
的重要性与编译器在某个类/ struct / field 的编译时所具有的知识和确定性有关。它与内存位置无关,它们是否被修复等等。用Eric Lippert的话来说:
静态方法被称为“静态”,因为它总是可以在编译时确切地确定将调用哪种方法。也就是说,该方法只能通过代码的静态分析来解决。